Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 分组,以便将行结果转换为分组列_Sql_Db2 - Fatal编程技术网

Sql 分组,以便将行结果转换为分组列

Sql 分组,以便将行结果转换为分组列,sql,db2,Sql,Db2,目前,我正在从一个db2表中进行选择,其中每一行由一个用户、子用户(想想user=manager,子用户=employee)、类别、每日销售和每周目标组成。以下是“全选”选项和结果: SELECT * FROM USER_SALES_UNITS WHERE DATE >= CURRENT_DATE USER | SUB_USER | CATEGORY | DAILY | WEEKLY --------------------------------

目前,我正在从一个db2表中进行选择,其中每一行由一个用户、子用户(想想user=manager,子用户=employee)、类别、每日销售和每周目标组成。以下是“全选”选项和结果:

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;