2013-11-25 2 views
1

에 의해 그룹을 사용하여 I가 다음과 같은 테이블 작성 스크립트 : 관계없이/총 금액의 최소 지불 한 고객들의 custid 및 CUSTNAME를 표시하는 쿼리를 작성할 때 나는 오류를 얻고있다mysql을

CREATE TABLE assetcost(
assettype VARCHAR(20) PRIMARY KEY, 
rentamt INT 
); 

CREATE TABLE furnishitem(
itemid VARCHAR(4) PRIMARY KEY CHECK(itemid LIKE 'I%'), 
description VARCHAR(30), 
availablesets INT, 
assettype VARCHAR(25), 
specialCharge CHAR(1) CHECK(specialcharge IN ('Y','N')), 
FOREIGN KEY(assettype) REFERENCES assetcost(assettype) 
); 

CREATE TABLE custdetail(
custid VARCHAR(5) PRIMARY KEY CHECK(custid LIKE 'C%'), 
custname VARCHAR(30) 
); 


CREATE TABLE transaction(
transid INT UNIQUE, 
custid VARCHAR(5) , 
itemid VARCHAR(4), 
sets INT, 
days INT, 
amount INT, 
returned char(1) Check (returned in('Y','N')), 
FOREIGN KEY(custid)REFERENCES custdetail(custid), 
FOREIGN KEY(itemid)REFERENCES furnishitem(itemid) 
); 

, 반환 된 항목의

내 쿼리는 다음과 같습니다

select t.custid,c.custname 
    -> from transaction t inner join custdetail c 
    -> on t.custid=c.custid 
    -> group by t.custid 
    -> having sum(amount)=(select min(sum(amount) from transaction group by custid); 
+1

무엇이 오류입니까? – Taryn

+0

RDBM에서 * 모든 * 테이블에는 원칙적으로 PRIMARY KEY가 있어야합니다. – Strawberry

답변

1
당신은 더 우아한 방식으로이 문제를 해결 할 수 있지만 문제에 대한 빠른 수정이 될 것

:

SELECT t.custid, c.custname 
FROM TRANSACTION t 
INNER JOIN custdetail c ON t.custid = c.custid 
GROUP BY t.custid 
HAVING sum(amount) = (
    SELECT sum(amount) 
    FROM TRANSACTION 
    GROUP BY custid 
    ORDER BY 1 ASC 
    LIMIT 1 
    ); 

당신은 정말 할 수 없습니다 한 번에 min(sum(amount))을 수행하십시오. 이 접근법은 최소 값을 가진 custid에 대한 합계가있는 행을 가져옵니다.

+0

감사합니다. Filipe. 위의 해결책은 나를 위해 잘 작동합니다. 다음 쿼리가 ERROR 1111 (HY000)을주는 이유를 설명해주십시오 : 그룹 기능의 사용이 잘못되었습니다 : custid에 의해 트랜잭션 그룹에서 custid, min (sum (amount))을 선택하십시오. 오라클에서는 잘 작동하지만 MySql에서 오류가 발생합니다. – user3029086

+0

MIN (SUM (abount))입니다. MIN과 SUM을 동시에 수행 할 수는 없습니다. 먼저 sum과 group by custid를 수행 한 다음 외부 쿼리에있는 MIN에서 MIN을 찾으십시오. –