2016-09-12 51 views
1

如何爲MySQL編寫一個查詢來篩選出總薪酬小於零的地方。 我嘗試過使用'HAVING'的不同命令,但我無法弄清楚正確的語法。如何在MySQL查詢中將WHERE和HAVING結合起來

這是我的命令:

SELECT tickets.idno, tickets.PAY, tickets.MATERIAL 
FROM tickets 
WHERE (tickets.PAY <> 0 OR tickets.MATERIAL <> 0) AND tickets.DISTRICT = 'HO' AND tickets.DATEPAID IS NULL 
ORDER BY tickets.NAME 

這個結果集:

HO0045 -140 0 
HO2203 -45  0 
HO2411 -5  0 
HO2411 20  0 
HO3448 -156 0 
HO2519 2000 0 
HO0075 -300 0 
HO1669 -55  0 
HO2666 -200 0 
HO2666 -200 0 
HO3447 -400 0 
HO3447 400  0 

這是結果,我現在得到的,但它需要消除這些記錄中,其中總收入+總材料給定IDNO的所有行都小於零。例如; HO2411和HO2519的所有行應該出現,但不是其餘的。

+1

見http://meta.stackoverflow.com/問題/ 333952 /爲什麼,應該-I-提供-AN-MCVE換什麼,似乎對我將要-A-極簡單的SQL查詢 – Strawberry

回答

1

HAVING是爲了過濾出整個組,但要做到這一點,您需要減少查詢GROUP BY。但不幸的是,您不能在過濾組後反轉分組操作。

所以你要做的子查詢過濾的組,然後JOIN導致回表,找到相應的IDNO行:

SELECT t.idno, t.PAY, t.MATERIAL 
FROM tickets AS t 
INNER JOIN (
    SELECT idno, SUM(PAY) AS PAY, SUM(MATERIAL) AS MATERIAL 
    FROM tickets 
    GROUP BY idno 
    HAVING PAY + MATERIAL < 0 
) AS total USING (idno) 
WHERE t.DISTRICT = 'HO' AND t.DATEPAID IS NULL 
ORDER BY t.NAME; 
相關問題