根据 id 列的条目数查询以将表中的数据聚合到另一个表中
Posted
技术标签:
【中文标题】根据 id 列的条目数查询以将表中的数据聚合到另一个表中【英文标题】:Query to aggregate data from table into another table based on number of entries of an id column 【发布时间】:2020-10-27 09:38:05 【问题描述】:我有一张这样的桌子:
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 和 3,那么我只想返回 order_id start_date、end_date 和金额列中的值
如果存在多个条目,例如 for 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
【问题讨论】:
【参考方案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
结果是:
【讨论】:
这不会为 order_id 2 返回错误的金额,其中 end_date 小于当前日期,并且我想返回未更正的金额,因为它只是一个条目? 抱歉,已修复一个IF
在对该解决方案进行了更多测试之后,它似乎不太奏效。 order_id 1 的返回值是两行而不是 1,但除了两者的总和是正确的。我只需要在同一行中同时获得 1 行的订单
我不得不将查询更改为 SELECT order_id, MIN(start_date) AS start_date, MAX(end_date) AS end_date, IF(COUNT(*) > 1, SUM(IF(end_date pomengine.Testdata.test GROUP BY order_id,amount 在 GROUP BY 中包含一个金额以使其运行,这可能是它创建错误总和的原因
ANY 只是给我一个错误:Unexpected keyword ANY 似乎只是将 ANY 更改为 SUM 解决了它,但我不知道这是否可行以及为什么以上是关于根据 id 列的条目数查询以将表中的数据聚合到另一个表中的主要内容,如果未能解决你的问题,请参考以下文章