2016-09-12 3 views
1

総支払額が0より小さい部分を除外する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/what-should-i-provide-an-mcve-for-what-to-be-a-very-simple-sql-query – Strawberry

答えて

1

HAVINGはグループ全体を除外することを意図していますが、そのためにはGROUP BYでクエリを減らす必要があります。しかし残念ながら、グループをフィルタリングした後、グループ化操作を元に戻すことはできません。

だから、対応するIDNOを持つ行を見つけるために戻って、テーブルにもたらすようJOIN、その後、グループをフィルタリングするサブクエリを実行する必要があります。

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; 
関連する問題