使用 SQL 将行转换为列
Converting row into column using SQL
我有一个生成以下结果的查询。但是我需要再次重组格式。我尝试使用 但出现错误(无法创建大于允许的行..)。我不太擅长 SQL 查询。请帮我解决这个问题。
Datasource AcctCode Amount
AB01 100 20,000.00
AB01 101 228.00
AB01 102 5,000.00
AB01 103 10,000.00
AB02 100 540,000.00
AB02 104 305,000.00
AB02 105 21,330.00
AB02 106 10,000.00
AB03 100 1,000.00
AB03 101 54,000.00
AB03 105 30,500.00
AB03 106 40,000.00
AB03 107 5,000.00
期待这个。
Accout AB01 AB02 AB03 Total
100 20,000.00 540,000.00 1,000.00 561,000.00
101 228.00 - 54,000.00 54,228.00
102 5,000.00 - - 5,000.00
103 10,000.00 - - 10,000.00
104 - 305,000.00 - 305,000.00
105 - 21,330.00 30,500.00 51,830.00
106 - 10,000.00 40,000.00 50,000.00
107 - - 5,000.00 5,000.00
如果您想要一组固定的 Datasource
,您可以像下面的查询一样使用 PIVOT 将行转置为列。
SELECT *
FROM
[YOUR_TABLE_NAME]
PIVOT
(
MAX(Amount)
FOR Datasource IN ([AB01], [AB02], [AB03])
) AS PivotTable;
如果此数据源列表是动态的,您可以像以下查询一样使用 Dynamic PIVOT。
DECLARE @cols AS NVARCHAR(max) = Stuff((SELECT DISTINCT ', ' + Quotename(Datasource)
FROM [YOUR_TABLE_NAME]
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
DECLARE @query AS NVARCHAR(max) = ' SELECT *
FROM [YOUR_TABLE_NAME]
PIVOT ( MAX(Amount)
FOR Datasource IN ('+@cols+') ) pvt';
EXECUTE(@query)
编辑:
在最后添加总库数。
DECLARE @cols AS NVARCHAR(max) = Stuff((SELECT DISTINCT ', ' + Quotename(Datasource)
FROM TABLE_NAME
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
DECLARE @sumcol AS NVARCHAR(max) = ','
+ Stuff((SELECT DISTINCT '+ ISNULL(' + Quotename(Datasource) + ',0)'
FROM TABLE_NAME
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + ' as Total';
DECLARE @query AS NVARCHAR(max) = ' SELECT *' + @sumcol + '
FROM TABLE_NAME
PIVOT ( MAX(Amount)
FOR Datasource IN ('+@cols+') ) pvt';
EXECUTE(@query)
我有一个生成以下结果的查询。但是我需要再次重组格式。我尝试使用
Datasource AcctCode Amount
AB01 100 20,000.00
AB01 101 228.00
AB01 102 5,000.00
AB01 103 10,000.00
AB02 100 540,000.00
AB02 104 305,000.00
AB02 105 21,330.00
AB02 106 10,000.00
AB03 100 1,000.00
AB03 101 54,000.00
AB03 105 30,500.00
AB03 106 40,000.00
AB03 107 5,000.00
期待这个。
Accout AB01 AB02 AB03 Total
100 20,000.00 540,000.00 1,000.00 561,000.00
101 228.00 - 54,000.00 54,228.00
102 5,000.00 - - 5,000.00
103 10,000.00 - - 10,000.00
104 - 305,000.00 - 305,000.00
105 - 21,330.00 30,500.00 51,830.00
106 - 10,000.00 40,000.00 50,000.00
107 - - 5,000.00 5,000.00
如果您想要一组固定的 Datasource
,您可以像下面的查询一样使用 PIVOT 将行转置为列。
SELECT *
FROM
[YOUR_TABLE_NAME]
PIVOT
(
MAX(Amount)
FOR Datasource IN ([AB01], [AB02], [AB03])
) AS PivotTable;
如果此数据源列表是动态的,您可以像以下查询一样使用 Dynamic PIVOT。
DECLARE @cols AS NVARCHAR(max) = Stuff((SELECT DISTINCT ', ' + Quotename(Datasource)
FROM [YOUR_TABLE_NAME]
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
DECLARE @query AS NVARCHAR(max) = ' SELECT *
FROM [YOUR_TABLE_NAME]
PIVOT ( MAX(Amount)
FOR Datasource IN ('+@cols+') ) pvt';
EXECUTE(@query)
编辑:
在最后添加总库数。
DECLARE @cols AS NVARCHAR(max) = Stuff((SELECT DISTINCT ', ' + Quotename(Datasource)
FROM TABLE_NAME
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
DECLARE @sumcol AS NVARCHAR(max) = ','
+ Stuff((SELECT DISTINCT '+ ISNULL(' + Quotename(Datasource) + ',0)'
FROM TABLE_NAME
FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 1, '') + ' as Total';
DECLARE @query AS NVARCHAR(max) = ' SELECT *' + @sumcol + '
FROM TABLE_NAME
PIVOT ( MAX(Amount)
FOR Datasource IN ('+@cols+') ) pvt';
EXECUTE(@query)