【问题标题】:Spliting GROUP BY results into different columns将 GROUP BY 结果拆分为不同的列
【发布时间】:2019-07-27 08:52:55
【问题描述】:

我有一列包含日期范围和与特定ID(一对多)关联的经过的天数,根据与其关联的记录数,我希望将这些结果分成列而不是单独的行,所以从这里:

id_hr  dd beg          end
----------------------------------------
1      10 05/01/2019   15/01/2019
1      5  03/02/2019   08/02/2019
2      8  07/03/2019   15/03/2019

可以变成这样:

id_hr  dd beg          end        dd beg          end
--------------------------------- ---------------------
1      10 05/01/2019   15/01/2019 5  03/02/2019   08/02/2019
2      8  07/03/2019   15/03/2019

我在工作表(数据透视表)中做了同样的事情,但表变得尽可能慢,所以我正在寻找一种更友好的 SQL 方法,我做了一个 CTE,它为关联的行编号,然后选择并在新列中显示它们。

;WITH CTE AS(
   SELECT PER_PRO, ID_HR, NOM_INC, rut_dv, dias_dur, INI, FIN,
       ROW_NUMBER()OVER(PARTITION BY ID_HR ORDER BY SUBIDO) AS RN
   FROM dbo.inf_vac WHERE PER_PRO = 201902
)
SELECT ID_HR, NOM_INC, rut_dv,
    (case when rn = 1 then DIAS_DUR end) as DIAS_DUR1,
    (case when rn = 1 then INI end) as INI1,
    (case when rn = 1 then FIN end) as FIN1,

    (case when rn = 2 then DIAS_DUR end) as DIAS_DUR2,
    (case when rn = 2 then INI end) as INI2,
    (case when rn = 2 then FIN end) as FIN2,

    (case when rn = 3 then DIAS_DUR end) as DIAS_DUR3,
    (case when rn = 3 then INI end) as INI3,
    (case when rn = 3 then FIN end) as FIN3
FROM CTE

这让我每列都知道它应该在哪里但没有分组。使用 GROUP BY 会在 CTE 选择上显示错误。

rn id_hr  dd    beg          end        dd    beg          end
----------------------------------- ------------------------
1  1      10   05/01/2019   15/01/2019 NULL  NULL         NULL
2  1      NULL NULL         NULL       5     03/02/2019   08/02/2019
1  2      8    07/03/2019   15/03/2019 NULL  NULL         NULL

有没有办法在第二次选择时对它们进行分组?

【问题讨论】:

    标签: sql sql-server-2008 common-table-expression


    【解决方案1】:

    是的,您可以对所有非 CASE 列进行 GROUP BY,并将 MAX 应用于每个 CASE 表达式列。

    【讨论】:

      【解决方案2】:

      结果集中有其他列不在查询中。但是,这应该有效:

      SELECT ID_HR,
             max(case when rn = 1 then DIAS_DUR end) as DIAS_DUR1,
             max(case when rn = 1 then INI end) as INI1,
             max(case when rn = 1 then FIN end) as FIN1,
      
             max(case when rn = 2 then DIAS_DUR end) as DIAS_DUR2,
             max(case when rn = 2 then INI end) as INI2,
             max(case when rn = 2 then FIN end) as FIN2,
      
             max(case when rn = 3 then DIAS_DUR end) as DIAS_DUR3,
             max(case when rn = 3 then INI end) as INI3,
             max(case when rn = 3 then FIN end) as FIN3
      FROM CTE
      GROUP BY ID_HR;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多