如何根据特定列对一组列进行 PIVOT?

Chr*_*ris -1 t-sql sql-server pivot

我有聚合数据列,并希望将它们转入我的“类型”列。

我的数据看起来像这样

ID          Country TYPE        Approved  Dispursed Payments  Amend  Deob
----------  ------- ----------  --------  --------- --------  -----  ----
40002-0086  US      Republic       79802  66163.05         0      0     0
40022-0002  Russia  Sultanate     456435         0      3000   9789   578
40002-0002  Nkorea  Dictatorship   50000     50000         0      0   789
40001-0001  Malta   Democracy     200000         0         0    456     0
40016-0013  UAE     Monarchy       65456    559542         0      0     0
40001-0002  Egypt   Federal       250000    250000         0      0    56
40002-0012  Canada  Parliamentary   7898      2000         0    789     0

Run Code Online (Sandbox Code Playgroud)

我试图让它看起来像这样

ID  Country Republic Approved   Republic Disbursed  Republic Repaid Sultanate Approved  Sultanate Disbursed Federal Approved    Federal Disbursed   Monarchy Payments
44408   UAE  52,624,624.00  854,046.73   678,678.00      684,829.00      684,751.98      -       -       -   
41898   Canada   23,423,423.00   3,454,345.00    58,810.00   783,766.15      783,766.15      453,654,423.00      8,368,354.00    386,836.00 

Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 PIVOT 运算符

这是我迄今为止尝试过的

SELECT 'ID' AS ID,   
[Republic Approved],[Republic Disbursed],[Republic Repaid],[Sultanate Approved],[Sultanate Disbursed],[Federal Approved],[Federal Disbursed],[Monarchy Payments]

FROM  
(SELECT ID, Country   
    FROM Table.ID) AS SourceTable  
PIVOT  
(  
[TYPE]  
FOR ID, Country IN ([Republic Approved],[Republic Disbursed],[Republic Repaid],[Sultanate Approved],[Sultanate Disbursed],[Federal Approved],[Federal Disbursed],[Monarchy Payments]
 )  
) AS PivotTable;  
Run Code Online (Sandbox Code Playgroud)

pwi*_*cox 5

要以多种方式旋转,您必须单独聚合每种方式。请注意,在下面的代码中,如果不满足 case 语句中的 'type' 条件,则返回 null。所以聚合(我在这里使用 sum)只会聚合那个类型。

select    id,
          country,
          [Republic Approved] = sum(case when type = 'republic' then approved end),
          [Republic Disbursed] = sum(case when type = 'republic' then disbursed end),
          ...,
          [Sultanate Approved] = sum(case when type = 'sultanate' then approved end),
          ...
from      sourceTable
group by  id, 
          country
Run Code Online (Sandbox Code Playgroud)

不过,我正在对您在这里真正想要的内容做出一些假设,因为您所说的期望结果意味着您的数据集中有更多数据。

或者,您可以先对这些付款类型列取消透视,将结果名称与政府类型连接起来,然后对连接的名称进​​行透视。但这会降低性能并且可能更不可读,尽管您可能会因为输入的字符更少而逃脱(从来不是最明智的目标)。