2013-11-25 25 views
1

使用組,我有以下表創建腳本:通過在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) 
); 

編寫查詢時顯示的那些誰也/支付總金額的最低客戶的客戶ID和CUSTNAME我得到的錯誤,不管返回的項目。

我的查詢是:

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

謝謝菲利普。上面的解決方案適合我。請解釋爲什麼下面的查詢給出錯誤1111(HY000):組函數的使用無效:通過custid從事務組中選擇custid,min(sum(金額));在oracle中它工作正常,但在MySql中發生錯誤。 – user3029086

+0

這是MIN(SUM(abount))。您不能同時執行MIN和SUM。您必須先按custid進行總和和分組,然後再從外部查詢中找到MIN。 –