繁体   English   中英

TSql数据透视表或行到列

[英]TSql Pivot or Rows to Columns

我已经在Pivot上看到了各种帖子,或者将行转换为列,但是我仍然没有运气,所以我决定发布问题。

我的表是的cols

Id col_name 1 Serial 2 Data1 3 Data2

我的表格

Id col_id value 1 1 1 2 1 2 3 1 3 4 2 25 5 2 26 6 2 27 7 3 28 8 3 29 9 3 30

我想要以下结果,我认为使用unpivot或pivot可能有效。 出来的应该是这样的-

Serial Data1 Data2 1 25 28 2 26 29 3 27 30

任何帮助都会有所帮助。

我将指出,您的数据模型需要改进,因此我的加入串行方法是即兴的,在现实生活的项目中不能被信任,您的表之间没有逻辑连接。 这是数据透视的方法:

;WITH [rows] AS
(
  SELECT id, value, col_id
  FROM 
    (values
    (1,1,1),(2,1,2),
    (3,1,3),(4,2,25),
    (5,2,26),(6,2,27),
    (7,3,28),(8,3,29),
    (9,3,30)) x(Id, col_id, value)
), cols as
(
  SELECT cols.id, col_name
  FROM
    (values
      ( 2, 'Data1'),( 3, 'Data2')) 
      cols(Id, col_name)
), result as
(
  SELECT row_number() OVER (partition by col_id order by [rows].id) rn, col_name, value
  FROM
    cols
  JOIN
    [rows]
  ON [rows].col_id = cols.id
  WHERE cols.id > 1
)
SELECT rn Serial, Data1, Data2
FROM
  result
PIVOT
(min([value])  
FOR col_name
in([Data1],[Data2])  
)AS p

结果:

Serial Data1 Data2
1      25    28
2      26    29
3      27    30

我认为pivot在这里没有用。 尝试这个

WITH cte1
     AS (SELECT Row_number()OVER(ORDER BY Id) RN,
                value            AS Data1
         FROM   yourtable
         WHERE  col_id = 1),
     cte2
     AS (SELECT Row_number()OVER(ORDER BY Id) RN,
                value            AS Data2
         FROM   yourtable
         WHERE  col_id = 2),
     cte3
     AS (SELECT Row_number()OVER(ORDER BY Id) RN,
                value            AS Data3
         FROM   yourtable
         WHERE  col_id = 3)
SELECT Row_number()OVER(ORDER BY a.rn) AS serial,
       Data1,
       Data2,
       Data3
FROM   cte1 A
       FULL OUTER JOIN cte2 B
                    ON a.RN = b.RN
       FULL OUTER JOIN cte3 C
                    ON b.RN = C.RN 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM