1

有一个问题。我有这个:

代码 | 数字
-------------
一个 |1
一个 |2
一个 |3
b |3
b |4

我需要让它看起来像:

一个 | b
---------
1 | 3
2 | 4
3 | 空值

现在我有这个解决方案:

SELECT CASE Code WHEN 'a' THEN Number END AS a,
    案例代码 WHEN 'b' THEN Number END AS b
FROM表CN

但它给了我这个:

一个 | b
---------
1 | 空值
2 | 空值
3 | 空值
空 | 3
空 | 4

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

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

更新1:

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

( MAX(Number) FOR 代码输入 ([a],[b]))
.

我试着:

( MAX(Number) FOR 代码 IN (
选择代码
  FROM 测试表
  按代码分组
))

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

4

1 回答 1

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
于 2012-11-16T09:52:28.383 回答