【问题标题】:PIVOT table from rows to column从行到列的 PIVOT 表
【发布时间】:2020-01-23 19:17:33
【问题描述】:

您好,我有一张类似于下面的表格,

PId  |  PocType       |   pocDate
---------------------------------------
109  | POC - Start |   2018-09-20
109  | POC - Start |   2018-07-07
109  | POC - Start |   2018-11-15
101  | POC - Start |   2019-07-17
101  | POC - Start |   2019-07-01
100  | POC - Start |   2019-05-07
100  | POC - Start |   2019-05-07
100  | POC - Start |   2019-01-22
100  | POC - Start |   2019-03-20

我想把它改成如下所示:

PId  |  Poc        |  pocDate  | procDate    | procDate   | procDate   | 
------------------------------------------------------------------------
109  | POC - Start | 2018-07-07 | 2018-09-20 | 2018-11-15 |            | 
101  | POC - Start | 2019-07-01 | 2019-07-17 |            |            | 
100  | POC - Start | 2019-01-22 | 2019-03-20 | 2019-05-07 | 2019-05-07 | 

我正在尝试使用 SQL PIVOT,但不成功。

select [PId],[pocDate]
from
(
  select [PId],[Poc],[pocDate]
  from #PocTable 
) x
pivot
(
  max(pocDate)
  for SystemProcedure in([pocDate])
)p

感谢您的帮助。

【问题讨论】:

  • 您有 4 个同名的列。另外,Proc 日期的数量是否有上限?其他 Poc 类型呢?
  • @jk1844 所以你想为每个pocdate创建一个新列?

标签: sql sql-server pivot


【解决方案1】:

我会使用条件聚合,但关键是row_number()

select pid,
       max(case when seqnum = 1 then pocdate end) as pocdate_1,
       max(case when seqnum = 2 then pocdate end) as pocdate_2,
       max(case when seqnum = 3 then pocdate end) as pocdate_3,
       max(case when seqnum = 4 then pocdate end) as pocdate_4
from (select t.*,
             row_number() over (partition by pid, poc_type order by pocdate) as seqnum
      from t
     ) t
group by pid;

【讨论】:

    【解决方案2】:

    如果你还是不明白,下面的 sn-p 会帮助你。

    您的问题中的架构:

    SELECT * INTO #TABLE FROM (
    SELECT 109  , 'POC - Start' ,  CAST( '2018-09-20' AS DATE) UNION ALL
    SELECT 109  , 'POC - Start' ,  CAST( '2018-07-07' AS DATE) UNION ALL
    SELECT 109  , 'POC - Start' ,  CAST( '2018-11-15' AS DATE) UNION ALL
    SELECT 101  , 'POC - Start' ,  CAST( '2019-07-17' AS DATE) UNION ALL
    SELECT 101  , 'POC - Start' ,  CAST( '2019-07-01' AS DATE) UNION ALL
    SELECT 100  , 'POC - Start' ,  CAST( '2019-05-07' AS DATE) UNION ALL
    SELECT 100  , 'POC - Start' ,  CAST( '2019-05-07' AS DATE) UNION ALL
    SELECT 100  , 'POC - Start' ,  CAST( '2019-01-22' AS DATE) UNION ALL
    SELECT 100  , 'POC - Start' ,  CAST( '2019-03-20' AS DATE)
    )A(PId,PocType,pocDate)
    

    您需要动态数据透视表和数据透视表列名称的计算列。

    DECLARE @COLS VARCHAR(MAX) = '', @SQL VARCHAR(MAX) = ''
    
    SELECT @COLS = @COLS+  QUOTENAME(SNO)+','  FROM (
    SELECT DISTINCT 'pocDate'+ 
    CAST( ROW_NUMBER() OVER(PARTITION BY PId ORDER BY pocDate ) AS VARCHAR(50)) SNO 
    FROM #TABLE
    )A
    
    SELECT  @COLS = LEFT(@COLS, LEN(@COLS)-1)
    
    SELECT  @SQL =  
    'SELECT * FROM (
    SELECT ''pocDate''
    + CAST( ROW_NUMBER() OVER(PARTITION BY PId ORDER BY pocDate ) AS VARCHAR(50)) SNO, * 
    FROM #TABLE
    )AS A
    PIVOT
    (
        MAX(pocDate) FOR SNO IN ('+@COLS+')
    )PV '
    
    
    EXEC (@SQL)
    

    结果:

    +-----+-------------+------------+------------+------------+------------+
    | PId |   PocType   |  pocDate1  |  pocDate2  |  pocDate3  |  pocDate4  |
    +-----+-------------+------------+------------+------------+------------+
    | 100 | POC - Start | 2019-01-22 | 2019-03-20 | 2019-05-07 | 2019-05-07 |
    | 101 | POC - Start | 2019-07-01 | 2019-07-17 | NULL       | NULL       |
    | 109 | POC - Start | 2018-07-07 | 2018-09-20 | 2018-11-15 | NULL       |
    +-----+-------------+------------+------------+------------+------------+
    

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多