我有下面的SQL表,其中包含随机生成的数据
Code Data
SL Payroll 22
SL Payroll 33
SL Payroll 43
.. .....
我要传输数据,因此格式如下所示
Code Data1 Data2 Data3 ..
SL Payroll 22 33 43 ....
有人建议使用数据透视表转换数据,如下所示
SELECT Code,
[22] Data1,
[33] Data2,
[43] Data3
FROM
(
SELECT *
FROM T
) TBL
PIVOT
(
MAX(Data) FOR Data IN([22],[33],[43])
) PVT
但是这假设数据点是静态的,例如22,33,但是它们是动态生成的。
答案 0 :(得分:2)
如果知道或希望的列数最大,则可以执行简单的PIVOT,否则,需要进行 DYNAMIC
示例
Select *
From (
Select [Code]
,[Data]
,[Col] = concat('Data',Row_Number() over (Partition By [Code] Order by 1/0))
From YourTable
) src
Pivot (max([Data]) for [Col] in ([Data1],[Data2],[Data3],[Data4],[Data5])) pvt
返回
Code Data1 Data2 Data3 Data4 Data5
SL Payroll 22 33 43 NULL NULL
答案 1 :(得分:1)
我将条件聚合与row_number()
一起使用:
select code,
max(case when seqnum = 1 then code end) as code_1,
max(case when seqnum = 2 then code end) as code_2,
max(case when seqnum = 3 then code end) as code_3
from (select t.*,
row_number() over (partition by code order by data) as seqnum
from t
) t
group by code;
答案 2 :(得分:0)
做动态透视图很久以前。
已更新:使您的代码和名称更接近。
无论您要为PIVOT设置多少列,它都可以使用,无论1还是20都不重要
DECLARE @SelectFieldNameList as varchar(8000)
DECLARE @SelectFieldNameListCount as varchar(8000)
Set @SelectFieldNameList = ''
Set @SelectFieldNameListCount = ''
-- this section selects the list of firm location names and puts them in a string to be used in the pivot
-- it does it for the field select list and the count select using ISNULL so it puts a 0 if no counts returned
SELECT top (999999) @SelectFieldNameList = @SelectFieldNameList + case when @SelectFieldNameList = '' then '' else ', ' end
+ '[' + Data + ']',
@SelectFieldNameListCount = @SelectFieldNameListCount + case when @SelectFieldNameListCount = '' then '' else ', ' end
+ 'ISNULL([' + Data + '], ''0'')' + Data
From TableName
Where Data IS NOT NULL AND Ltrim(Data) <> ''
Group by Data
-- just for testing
select @SelectFieldNameList, @SelectFieldNameListCount
-- NOW USE THE ABOVE TO get the data pivoted with your dyanic fields
EXEC('
SELECT [Code], ' + @SelectFieldNameListCount + '
FROM (
SELECT [Code], Data, Sum(CountTotal) as CountTotal
From TableName
Group by [Code], Data
) AS TableToBePivoted
PIVOT (
SUM(CountTotal)
FOR Data IN (' + @SelectFieldNameList + ')
) AS PivotedTable
order by [Code];
')