我有一张这样的桌子:
order_id start_date end_date amount corrected_amount
1 2020-01-01 2020-01-31 100 95
1 2020-02-01 2020-02-28 200 200
1 2020-03-01 2020-03-30 100 100
1 2020-10-01 2020-11-25 200 95
2 2020-01-01 2020-05-30 500 250
3 2020-01-01 2020-12-31 400 5
我正在尝试创建一个查询,以将其聚合到一个较小的表中,每个order_id仅包含一行,我需要使用一些我在实现时遇到一些问题的规则来将其汇总在一起。
在仅存在一个条目(例如ID 2和ID 3)的情况下,我只想从数量列中返回order_id的起始日期,结束日期和值
在存在多个像1这样的条目的情况下,我想返回order_id,最小的start_date,最大的end_date,并且对于比今天的日期“低”的每个end_date,我想总结corrected_amounts和还将其添加到end_date比今天“大”的金额。
对于上面的表格,结果看起来像
order_id start_date end_date amount
1 2020-01-01 2020-11-25 595
2 2020-01-01 2020-05-30 500
3 2020-01-01 2020-12-31 400
答案 0 :(得分:1)
考虑使用IF
:
WITH TestData AS (
SELECT 1 as order_id, DATE('2020-01-01') as start_date, DATE('2020-01-31') as end_date, 100 as amount, 95 as corrected_amount UNION ALL
SELECT 1, DATE('2020-02-01'), DATE('2020-02-28'), 200, 200 UNION ALL
SELECT 1, DATE('2020-03-01'), DATE('2020-03-30'), 100, 100 UNION ALL
SELECT 1, DATE('2020-10-01'), DATE('2020-11-25'), 200, 95 UNION ALL
SELECT 2, DATE('2020-01-01'), DATE('2020-05-30'), 500, 250 UNION ALL
SELECT 3, DATE('2020-01-01'), DATE('2020-12-31'), 400, 5
)
SELECT order_id,
MIN(start_date) AS start_date,
MAX(end_date) AS end_date,
IF(COUNT(*) > 1,
SUM(IF(end_date < CURRENT_DATE(), corrected_amount, amount)),
SUM(amount)
) as amount
FROM TestData
GROUP BY order_id
结果是: