SQL转换数据

时间:2018-04-26 16:20:09

标签: sql sql-server pivot

我的结果来自以下格式的查询

ID CODE
----------
 1   abc
 1   xyz
 1   def
 1   pqr
 1   jkl
 1   tuv

我希望结果采用以下格式

ID CODE1 CODE2 CODE3 CODE4 CODE5 CODE6
---------------------------------------
1  abc   xyz   def   pqr   jkl   tuv

我知道这可以使用静态PIVOT查询来实现,但我面临的问题是CODE列可能有未知值,我希望我的列名被修复,即{{1 }},CODE1等等'直到CODE2

有人可以帮我解决这个问题吗?

欢迎任何建议。

谢谢。

1 个答案:

答案 0 :(得分:5)

这可以是使用ROW_NUMBER()窗口函数的相当简单的PIVOT。我为CODE 1投了第7 ID来表示如果你只旋转了6列,它会被忽略,因为你的OVER不是确定性的(它可以{ {1}}因为它只使用ORDER),所以它想要的任何方式,可以选择一组不同的6 ID

SQL Fiddle

MS SQL Server 2017架构设置

CODE

查询1

CREATE TABLE t1 ( ID int, _CODE varchar(20) ) ;
INSERT INTO t1 (ID, _CODE)
VALUES 
    (1,'abc')
  , (1,'xyz')
  , (1,'def')
  , (1,'pqr')
  , (1,'jkl')
  , (1,'tuv')
  , (2,'lmn')
  , (2,'rgb')
  , (1,'ignoredOnly6')
;

<强> Results

SELECT piv.ID
  , piv.[1] AS CODE1
  , piv.[2] AS CODE2
  , piv.[3] AS CODE3
  , piv.[4] AS CODE4 
  , piv.[5] AS CODE5 
  , piv.[6] AS CODE6
FROM (
  SELECT t1.ID, t1._CODE
    , ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY t1.ID) AS rn
  FROM t1
) s1
PIVOT (
  max(s1._CODE) 
  FOR s1.rn IN ([1],[2],[3],[4],[5],[6]) 
) piv