将值分组并将分组名称放入列名称

时间:2012-11-16 09:36:48

标签: sql

有一个问题。我有这个:

Code | Number
-------------
a    |1
a    |2
a    |3
b    |3
b    |4

我需要看起来像:

a  |  b
---------
1  | 3
2  | 4
3  | null

现在我有了这个解决方案:

SELECT CASE Code WHEN 'a' THEN Number END AS a,
    CASE Code WHEN 'b' THEN Number END AS b
FROM tableCN

但它给了我这个:

a    |  b
---------
1    | null
2    | null
3    | null
null | 3
null | 4

当然,我在实际表格中有更多的代码和数字。

如果有人有任何建议? 我感谢任何帮助!
 谢谢你的时间。

更新1:

大!以前从未见过PIVOT功能。但你已经硬编码了代码:

( MAX(Number) FOR Code IN ([a],[b]))

我尝试:

( MAX(Number) FOR Code IN (
SELECT  Code
  FROM testTable
  group by Code
))

我想我根本不明白发生了什么=(

1 个答案:

答案 0 :(得分:1)

这个想法是使用PIVOT,但由于你没有表中的唯一键,你需要生成一个能够用ROW_NUMBER()输出你的记录集:

此示例将动态执行,http://sqlfiddle.com/#!3/8c592/20

  DECLARE @SQL NVARCHAR(MAX)

  DECLARE @Pivot NVARCHAR(MAX)

  SELECT @Pivot = (SELECT 
                     DISTINCT '['+CODE +'],'
                  FROM
                    tblTest
                  FOR XML PATH(''))



  SET @SQL = '
              SELECT 
                pvt.a, pvt.b
              FROM
                (SELECT Code, Number, ROW_NUMBER() OVER (Partition BY code ORDER BY Number) rn FROM tblTest)
                 tblTest
              PIVOT
                ( MAX(Number) FOR Code IN ('+LEFT(@Pivot,LEN(@Pivot)-1)+'))
                PVT
              '

  EXEC sp_Executesql @statement = @SQL

此代码将执行此操作http://sqlfiddle.com/#!3/8c592/11

 SELECT 
     rn,pvt.*
 FROM
    (
      SELECT Code, Number, ROW_NUMBER() OVER (Partition BY code ORDER BY Number) rn 
      FROM tblTest
     )
   tblTest
PIVOT
  ( MAX(Number) FOR Code IN ([a],[b]))
PVT

这是与您的确切输出http://sqlfiddle.com/#!3/8c592/14匹配的代码:

  SELECT 
    pvt.a, pvt.b
  FROM
    (   
       SELECT Code, Number, ROW_NUMBER() OVER (Partition BY code ORDER BY Number) rn 
       FROM tblTest
    )
     tblTest
  PIVOT
    ( MAX(Number) FOR Code IN ([a],[b]))
    PVT