如何在 SQL 中获取 6 个月间隔内列的不同日期计数总和?

问题描述 投票:0回答:0

我有一个用户级别的交易表,我想聚合它们,例如每个用户每个单独列的不同交易日期计数的总和。我使用子查询来做这个聚合,但没有得到正确的输出。

最小的桌子和我的尝试 :

CREATE TABLE trans (
  user_id char(10),
  purchase_date date,
  prod1_amt int(10),
  prod2_amt int(10),
  prod3_amt int(10),
  prod4_amt int(10),
  prod5_amt int(10),
  prod6_amt int(10)
);

INSERT INTO trans (user_id, purchase_date, prod1_amt, prod2_amt, prod3_amt, prod4_amt, prod5_amt, prod6_amt)
VALUES (A,1/14/2021,10,6,0,0,11,0)
        ,(A,6/14/2021,10,6,0,0,11,0)
        ,(B,1/14/2021,10,6,0,0,11,0)
        ,(B,11/14/2021,10,6,0,0,11,0)
        ,(C,6/14/2021,10,6,0,0,11,0)
       , (B,1/10/2022,5,18,0,5,11,7)
       ,(A,1/19/2022,6,18,2,5,0,0)
       ,(A,1/19/2022,10,28,1,7,11,7)
       ,(B,1/19/2022,100,18,1,5,11,7)
       ,(C,1/20/2022,25,18,1,5,11,7)
       ,(C,1/20/2022,35,18,1,5,11,7)
       ,(B,4/19/2022,9,18,1,5,11,7)
       ,(A,5/23/2022,10,18,1,0,0,0)
       ,(A,7/23/2022,10,18,1,5,11,7)
       ,(B,7/23/2022,10,18,11,15,11,17)
       ,(C,8/23/2022,10,18,1,5,11,7);

我当前的查询

CREATE OR REPLACE TABLE aggr_output_table(
    WITH trns_base AS (
        SELECT *, 
            EXTRACT(YEAR FROM purch_date) || '_' || 
            CASE 
            WHEN EXTRACT(QUARTER FROM purch_date) IN (1, 2) THEN 'h1'
            WHEN EXTRACT(QUARTER FROM purch_date) IN (3, 4) THEN 'h2'
            END AS period_dt,
        FROM (
        SELECT *, 
            user_id,
            count(distinct purchase_date) purch_dt
        FROM trans 
        )
    ),
    aggregation AS (
        SELECT 
            user_id, 
            concat(period_dt || '_' ||, prod1_amt, prod2_amt, prod3_amt, prod4_amt, prod5_amt, prod6_amt) AS tx_period_metric,
            COUNT(DISTINCT tx_date) cnt
        FROM trns_base
        GROUP BY 1, 2
    )
    select
        base.*,
        sum(base.cnt)
    from trns_base base
)

但是这个查询并没有给出我预期的输出。谁能建议更好的解决方法来完成这项工作?

目标

我只想获取每个用户每个单独列的交易日期的计数总和。我怎样才能修复我上面的 sql 尝试?谁能用更好的方法指出我?

期望的输出

我想我要做的不是很复杂,只是连接相应的年份和列名我不清楚如何在 SQL 中完成。这是预期输出表的表模式:

CREATE TABLE aggr_trans (
  user_id char(10),
  2021_h1_trns_cnt_prod1_amt int(10),
  2021_h2_trns_cnt_prod1_amt int(10),
  2022_h1_trns_cnt_prod1_amt int(10),
  2022_h2_trns_cnt_prod1_amt int(10),
  
  2021_h1_trns_cnt_prod2_amt int(10),
  2021_h2_trns_cnt_prod2_amt int(10),
  2022_h1_trns_cnt_prod2_amt int(10),
  2022_h2_trns_cnt_prod2_amt int(10),
  
  2021_h1_trns_cnt_prod3_amt int(10),
  2021_h2_trns_cnt_prod3_amt int(10),
  2022_h1_trns_cnt_prod3_amt int(10),
  2022_h2_trns_cnt_prod3_amt int(10),
  
  2021_h1_trns_cnt_prod4_amt int(10),
  2021_h2_trns_cnt_prod4_amt int(10),
  2022_h1_trns_cnt_prod4_amt int(10),
  2022_h2_trns_cnt_prod4_amt int(10),
  
  2021_h1_trns_cnt_prod5_amt int(10),
  2021_h2_trns_cnt_prod5_amt int(10),
  2022_h1_trns_cnt_prod5_amt int(10),
  2022_h2_trns_cnt_prod5_amt int(10),
  
  2021_h1_trns_cnt_prod6_amt int(10),
  2021_h2_trns_cnt_prod6_amt int(10),
  2022_h1_trns_cnt_prod6_amt int(10),
  2022_h2_trns_cnt_prod6_amt int(10)
);
mysql sql aggregation
© www.soinside.com 2019 - 2024. All rights reserved.