繁体   English   中英

从同一个表中按不同条件对多列求和,然后按日期分组

[英]SUM multiple columns by different condition from same table and then group by date

我尝试对多列(CASH+CARD+CHEQUE+REST)的值求和并将它们分组以显示每天的总数。

实际表:

日期 现金 卡片 查看 REST 类型
2022-06-02 150.00 200.00 0.00 12.00 商店1
2022-06-02 150.00 240.00 56.00 67.00 商店2
2022-06-02 45.00 459.00 150.00 0.00 商店3
2022-06-02 45.00 400.00 150.00 34.00 旅游1
2022-06-03 87.00 59.00 150.00 400.00 商店1
2022-06-03 45.00 790.00 450.00 104.00 商店2
2022-06-03 70.00 30.00 0.00 241.00 商店3
2022-06-03 30.00 120.00 11.00 72.00 旅游1

我希望它成为新表:

日期 TOTAL_SALE STORE_TOTAL TRAVEL_TOTAL
2022-06-02 2158.00 1529.00 629.00
2022-06-03 2659.00 2426.00 233.00

我尝试使用 UNION 但将结果放在另一个之下而不是像这样在同一行中,我也尝试了下面的选项但收到此错误

#1111 无效使用组 function

我使用的代码会产生错误:

SELECT DATE, (SUM(CASH) + SUM(CARD) + SUM(CHEQUE) + SUM(REST)) AS TOTAL_SALE,

SUM(case when TYPE LIKE 'STORE%' then (SUM(CASH) + SUM(CARD) + SUM(CHEQUE) + SUM(REST))
else 0 end) as STORE_TOTAL,
SUM(case when TYPE LIKE 'TRAVEL%' then (SUM(CASH) + SUM(CARD) + SUM(CHEQUE) + SUM(REST))
else 0 end) as TRAVEL_TOTAL

FROM tbl_Payment where DATE BETWEEN '2022-06-02' AND '2022-06-03'
GROUP BY DATE ASC

首先, group by不接受订单。 没有asc

问题是将sum放入sum中。 sum中的任何内容都将按求和,无需再次求和。

同样,您不必对每一列求和,然后再相加。 添加列然后求和。 这更简洁一些。

SELECT
  "DATE",
  SUM(CASH + CARD + CHEQUE + REST) AS TOTAL_SALE,
  SUM(
    case when TYPE LIKE 'STORE%' then
      CASH + CARD + CHEQUE + REST
    else
      0
    end
  ) as STORE_TOTAL,
  SUM(
    case when TYPE LIKE 'TRAVEL%' then
      CASH + CARD + CHEQUE + REST
    else
      0
    end
  ) as TRAVEL_TOTAL
FROM tbl_Payment
where "DATE" BETWEEN '2022-06-02' AND '2022-06-03'
GROUP BY "DATE"

注意: date是 SQL 关键字。 它可能与类型date混淆。 避免将其用作列名。 使用aton约定命名时间戳和日期列。 例如, paid_on

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM