我在使用数据透视表或动态表时遇到问题。
我发现这个例子非常有助于理解我如何完成这项任务;但是,我错过了内部标识符列。
Dynamic Pivot Columns in SQL Server
上面的帖子中提供了一个SQL小提琴:http://www.sqlfiddle.com/#!3/7fad2/6
您可以看到在第二个表propertyObjects中,每个objectID都有一个计数1,2,3,4。我没有那个propertyID计数。这就是我的全部
case category
1 xx
1 xyx
1 abc
2 ghj
2 asdf
3 dfgh
如您所见,每种情况都有多种不同的类别,但没有类别标识符字段。
这就是我需要的:
case cat1 cat2 cat3
1 xx xyx abc
2 ghj asdf
3 dfgh
所以我想我可能需要在源表中添加一个列,并以某种方式枚举每个案例的类别。这将使我可以在提供的示例中使用枢轴。思考?
我尝试使用row_number
来完成此操作,但它并不会停留在每个案例编号上,而是继续计算整个表格。
答案 0 :(得分:1)
由于每个case
都有多个值,因此您需要使用row_number()
为每个类别获取单独的列。
在编写动态SQL版本之前,我会首先编写一个硬编码版本。代码类似于:
SELECT [case], cat1, cat2, cat3
FROM
(
SELECT [case], category,
'cat'+
cast(row_number() over(partition by [case]
order by category) as varchar(10)) seq
FROM yourTable
) x
PIVOT
(
max(category)
for seq in (cat1, cat2, cat3)
)p;
现在你有了逻辑,然后你可以将它转换为动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME('cat'+cast(seq as varchar(10)))
from
(
select row_number() over(partition by [case]
order by category) seq
from yourtable
) d
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [case],' + @cols + '
from
(
SELECT [case], category,
''cat''+
cast(row_number() over(partition by [case]
order by category) as varchar(10)) seq
FROM yourTable
) x
pivot
(
max(category)
for seq in (' + @cols + ')
) p '
execute sp_executesql @query;
见SQL Fiddle with Demo。这将给你结果:
| CASE | CAT1 | CAT2 | CAT3 |
|------|------|--------|--------|
| 1 | abc | xx | xyx |
| 2 | asdf | ghj | (null) |
| 3 | dfgh | (null) | (null) |