【问题标题】:MYSQL SUM(IF) with group by NAME but some NAME wanna makes sumMYSQL SUM(IF) 按名称分组,但有些名称想求和
【发布时间】:2020-03-10 16:01:04
【问题描述】:

我有一个关于 SQL 的问题。

这是查询。

SELECT Customer,
        SUM(IF(date_format(OutputDate, '%Y') = 2020 AND date_format(OutputDate, '%m') = 3, SupplyPrice, 0)) AS March
    FROM (SELECT Customer, OutputDate, SupplyPrice FROM `TableOutput`) AS C
    GROUP BY Customer
    ORDER BY March DESC
  LIMIT 20;

结果如下:

Customer       March
A              100
B              200
C              300
D              400
...

但我想让客户 A 和 B 加起来为 A(不是 B)或新名称(例如 Z)

像这样:

Customer       March
A(or Z)        300
C              300
D              400
...

我想修改查询并输出。

【问题讨论】:

  • 所以您只想将客户 A 和 B 加到 Z 中,还是您也不想对其他值执行此操作?比如 (C + D) = X、(E+F) Y 等等。

标签: mysql sql database group-by count


【解决方案1】:

我了解到您希望将客户 AB 归为一组。您可以使用CASE 表达式来做到这一点:

SELECT 
    (CASE WHEN customer IN ('A', 'B') THEN 'A' ELSE Customer
     END) as real_customer,
    SUM(CASE WHEN outputDate >= '2020-03-01' AND outputDate < '2020-04-01' THEN SupplyPrice ELSE 0 END) AS March
FROM `TableOutput`
GROUP BY real_customer
ORDER BY March DESC
LIMIT 20;

请注意,我修改了outputDate 上的日期谓词,因此它使用与日期文字的比较而不是使用日期函数;这是一种更有效的方法,可以利用可能存在的索引。

【讨论】:

  • 我真的很尊重你。谢谢你。这是一个很大的帮助。
  • A 和 B 到 X,C 和 D 到 Y ... 等等如果我有很多条件要显示,我该怎么办?
  • @Mark:你可以扩展case表达式,比如:CASE WHEN customer in ('A', 'B') THEN 'Z' WHEN customer in ('C', 'D') THEN 'Y' ... ELSE customer END
  • CASE WHEN Customer IN ('A', 'B') THEN 'X' WHEN Customer IN ('C', 'D') THEN 'Y' ELSE Customer END CustomerRearranged, >>> 谢谢求您的帮助~!
  • @GMB 。 . .我通常将end 对齐在case 下,这样这样的东西是可见的。我将在此处进行更改,如果您愿意,可以撤消。
猜你喜欢
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 2020-06-26
  • 2020-08-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
相关资源
最近更新 更多