有一个问题。我有这个:
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
当然,我在实际表格中有更多的代码和数字。
如果有人有任何建议?
我感谢任何帮助!
谢谢你的时间。
大!以前从未见过PIVOT
功能。但你已经硬编码了代码:
( MAX(Number) FOR Code IN ([a],[b]))。
我尝试:
( MAX(Number) FOR Code IN ( SELECT Code FROM testTable group by Code ))
我想我根本不明白发生了什么=(
答案 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