【问题标题】:How to combine WHERE and HAVING in a MySQL query如何在 MySQL 查询中结合 WHERE 和 HAVING
【发布时间】:2016-09-12 22:26:17
【问题描述】:

我如何为 MySQL 编写一个查询,以过滤掉总工资小于零的地方。 我尝试过使用“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 的所有行都应该出现,但其余的不会出现。

【问题讨论】:

标签: mysql group-by having


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多