根据 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 列的条目数查询以将表中的数据聚合到另一个表中的主要内容,如果未能解决你的问题,请参考以下文章

Clickhouse 将一张表中的数据聚合到另一张表中

ABAP 中内表的复制

更新查询以根据另一表中的值更改一个表中列的现有值

SQL UPDATE(从一行复制到另一行)

mysql 设置外键,能否将表中多个字段关联到另一个表中的同一字段

把一个表中的数据导入到另一个表中