Sql 分组,以便将行结果转换为分组列
目前,我正在从一个db2表中进行选择,其中每一行由一个用户、子用户(想想user=manager,子用户=employee)、类别、每日销售和每周目标组成。以下是“全选”选项和结果:Sql 分组,以便将行结果转换为分组列,sql,db2,Sql,Db2,目前,我正在从一个db2表中进行选择,其中每一行由一个用户、子用户(想想user=manager,子用户=employee)、类别、每日销售和每周目标组成。以下是“全选”选项和结果: SELECT * FROM USER_SALES_UNITS WHERE DATE >= CURRENT_DATE USER | SUB_USER | CATEGORY | DAILY | WEEKLY --------------------------------
SELECT * FROM USER_SALES_UNITS WHERE DATE >= CURRENT_DATE
USER | SUB_USER | CATEGORY | DAILY | WEEKLY
------------------------------------------------------------
123 212 RED 100 200
123 212 BLUE 125 300
123 212 GREEN 150 150
123 212 BLACK 200 200
123 212 ORANGE 250 300
123 331 RED 125 150
123 331 BLUE 150 200
123 331 GREEN 300 300
123 331 BLACK 450 150
123 331 ORANGE 125 200
基本上,我得到了每个经理的结果。这正是我所期望的,但我不知道如何实现我想要的结果,即将类别每日销售额和类别每周目标移动到标题中,以便在脚本中导出文件
我知道我需要按用户分组,但我如何才能正确地获得每个类别每日销售额(每个类别的sub_用户实例总和)和每个类别每周目标的总和。所以基本上,red_daily是所有类别为红色的每日总计的总和,在用户级别分组
这是我希望实现的目标,而不是上述结果:
USER | RED_DAILY | RED_WEEKLY | BLUE_DAILY | BLUE_WEEKLY | GREEN_DAILY | GREEN_WEEKLY | BLACK_DAILY | BLACK_WEEKLY | ORANGE_DAILY | ORANGE_WEEKLY
------------------------------------------------------------------------------------------------------------------------------------------------------------------
123 225 350 275 500 450 450 650 350 375 500
您需要条件聚合:
select user,
sum(case when category = 'red' then daily else 0 end) as red_daily,
sum(case when category = 'red' then weekly else 0 end) as red_weekly,
sum(case when category = 'blue' then daily else 0 end) as blue_daily,
sum(case when category = 'blue' then weekly else 0 end) as blue_weekly,
sum(case when category = 'green' then daily else 0 end) as green_daily,
sum(case when category = 'green' then weekly else 0 end) as green_weekly,
sum(case when category = 'black' then daily else 0 end) as black_daily,
sum(case when category = 'black' then weekly else 0 end) as black_weekly,
sum(case when category = 'orange' then daily else 0 end) as orange_daily,
sum(case when category = 'orange' then weekly else 0 end) as orange_weekly
from user_sales_unit
where date >= current_date
group by user;
您需要条件聚合:
select user,
sum(case when category = 'red' then daily else 0 end) as red_daily,
sum(case when category = 'red' then weekly else 0 end) as red_weekly,
sum(case when category = 'blue' then daily else 0 end) as blue_daily,
sum(case when category = 'blue' then weekly else 0 end) as blue_weekly,
sum(case when category = 'green' then daily else 0 end) as green_daily,
sum(case when category = 'green' then weekly else 0 end) as green_weekly,
sum(case when category = 'black' then daily else 0 end) as black_daily,
sum(case when category = 'black' then weekly else 0 end) as black_weekly,
sum(case when category = 'orange' then daily else 0 end) as orange_daily,
sum(case when category = 'orange' then weekly else 0 end) as orange_weekly
from user_sales_unit
where date >= current_date
group by user;
在我看来,这就像一个大型pivot查询:
SELECT
USER,
SUM(CASE WHEN CATEGORY = 'RED' THEN DAILY ELSE 0 END) AS RED_DAILY,
SUM(CASE WHEN CATEGORY = 'RED' THEN WEEKLY ELSE 0 END) AS RED_WEEKLY,
SUM(CASE WHEN CATEGORY = 'BLUE' THEN DAILY ELSE 0 END) AS BLUE_DAILY,
SUM(CASE WHEN CATEGORY = 'BLUE' THEN WEEKLY ELSE 0 END) AS BLUE_WEEKLY,
SUM(CASE WHEN CATEGORY = 'GREEN' THEN DAILY ELSE 0 END) AS GREEN_DAILY,
SUM(CASE WHEN CATEGORY = 'GREEN' THEN WEEKLY ELSE 0 END) AS GREEN_WEEKLY,
SUM(CASE WHEN CATEGORY = 'BLACK' THEN DAILY ELSE 0 END) AS BLACK_DAILY,
SUM(CASE WHEN CATEGORY = 'BLACK' THEN WEEKLY ELSE 0 END) AS BLACK_WEEKLY,
SUM(CASE WHEN CATEGORY = 'ORANGE' THEN DAILY ELSE 0 END) AS ORANGE_DAILY,
SUM(CASE WHEN CATEGORY = 'ORANGE' THEN WEEKLY ELSE 0 END) AS ORANGE_WEEKLY
FROM yourTable
GROUP BY USER;
在我看来,这就像一个大型pivot查询:
SELECT
USER,
SUM(CASE WHEN CATEGORY = 'RED' THEN DAILY ELSE 0 END) AS RED_DAILY,
SUM(CASE WHEN CATEGORY = 'RED' THEN WEEKLY ELSE 0 END) AS RED_WEEKLY,
SUM(CASE WHEN CATEGORY = 'BLUE' THEN DAILY ELSE 0 END) AS BLUE_DAILY,
SUM(CASE WHEN CATEGORY = 'BLUE' THEN WEEKLY ELSE 0 END) AS BLUE_WEEKLY,
SUM(CASE WHEN CATEGORY = 'GREEN' THEN DAILY ELSE 0 END) AS GREEN_DAILY,
SUM(CASE WHEN CATEGORY = 'GREEN' THEN WEEKLY ELSE 0 END) AS GREEN_WEEKLY,
SUM(CASE WHEN CATEGORY = 'BLACK' THEN DAILY ELSE 0 END) AS BLACK_DAILY,
SUM(CASE WHEN CATEGORY = 'BLACK' THEN WEEKLY ELSE 0 END) AS BLACK_WEEKLY,
SUM(CASE WHEN CATEGORY = 'ORANGE' THEN DAILY ELSE 0 END) AS ORANGE_DAILY,
SUM(CASE WHEN CATEGORY = 'ORANGE' THEN WEEKLY ELSE 0 END) AS ORANGE_WEEKLY
FROM yourTable
GROUP BY USER;