使用 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)