繁体   English   中英

需要帮助将行转置为列

[英]Need help to transpose rows to columns

我很抱歉要求有人为我编写我的代码,但是我已经把我的头发撕掉了近一个小时,试图让pivot操作员在SQL中工作。

我有以下结果集:

SCCY AccountedPremiumCurrent AccountedPremiumPrevious
---- ----------------------- ------------------------
CAD  99111.0000              NULL
EUR  467874.0000             128504.0000
GBP  431618.3847             195065.8751
USD  1072301.1193            1171412.1193

我需要将它转向这个:

GBP         USD          CAD        EUR
----------- ------------ ---------- -----------
431618.3847 1072301.1193 99111.0000 467874.0000
195065.8751 1171412.1193 NULL       128504.0000

我有一个解决方法,使用一个联合跨两个丑陋的“ select max(case when... )查询,但我很想让这个与枢轴运算符一起工作。

我觉得我的大脑无法处理执行此操作的必要逻辑,因此我要求有人帮忙。 一旦我得到这个,我就能够像专业人士一样重新申请这个......

您可以使用以下查询执行此操作:

SELECT col, [CAD], [EUR], [GBP], [USD]
FROM (
   SELECT SCCY, col, val
   FROM mytable
   CROSS APPLY (SELECT 'current', AccountedPremiumCurrent UNION ALL
                SELECT 'previous', AccountedPremiumPrevious) x(col, val) ) src
PIVOT (
  MAX(val) FOR SCCY IN ([CAD], [EUR], [GBP], [USD])
) pvt                                               

在SQL Server中无法在多个列上进行PIVOT ,例如AccountedPremiumCurrentAccountedPremiumPrevious 因此,在CROSS APPLY PIVOT之前,使用CROSS APPLY技巧来取消这两列的PIVOT

在通过上述查询产生的输出, col等于current用于来自值AccountedPremiumCurrent和等于previous用于来自值AccountedPremiumPrevious

在这里演示

如果需要动态数据透视(事先不知道列值),则可以执行以下查询。

首先声明一个变量来动态获取列值

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + SCCY + ']', '[' + SCCY + ']')
               FROM    (SELECT DISTINCT SCCY FROM #TEMP) PV 
               ORDER BY SCCY

现在使用以下查询进行透视。 我已经使用CROSS APPLY将两列值添加到一列。

DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT ' + @cols + ' FROM 
             (
                 SELECT SCCY,AccountedPremium,
                 ROW_NUMBER() OVER(PARTITION BY SCCY ORDER BY (SELECT 0)) RNO 
                 FROM #TEMP
                 CROSS APPLY(VALUES (AccountedPremiumCurrent),(AccountedPremiumPrevious))
                 AS COLUMNNAMES(AccountedPremium)
             ) x
             PIVOT 
             (
                 MAX(AccountedPremium)
                 FOR SCCY IN (' + @cols + ')
            ) p
            ' 

EXEC SP_EXECUTESQL @query 

使用PIVOT两次和UNION ALL就像这样

With MyTable as
(
    Select 'CAD' SCCY, 99111.0000 AccountedPremiumCurrent, NULL AccountedPremiumPrevious
    Union Select 'EUR', 467874.0000 , 128504.0000
    Union Select 'GBP', 431618.3847 , 195065.8751
    Union Select 'USD', 1072301.1193 , 1171412.1193
)
Select Sum (CAD) Cad, Sum (EUR) Eur, Sum (GBP) GBP, Sum (USD) USD
From MyTable
Pivot 
(
    Sum (AccountedPremiumCurrent) 
    For Sccy In ([CAD], [EUR], [GBP], [USD])
) as P

UNION ALL

Select Sum (CAD) Cad, Sum (EUR) Eur, Sum (GBP) GBP, Sum (USD) USD
From MyTable
Pivot 
(
    Sum (AccountedPremiumPrevious) 
    For Sccy In ([CAD], [EUR], [GBP], [USD])
) as P

这就是我得到的答案

Cad          Eur            GBP            USD
------------ -------------- -------------- ---------------
NULL         128504.0000    195065.8751    1171412.1193
99111.0000   467874.0000    431618.3847    1072301.1193

您的源表不能包含两个要转动的字段,因此将它们与其他一些任意数据结合在一起以区分它们(在下面的情况下, [status]字段是'Current''Previous' )。 完成后,应用在pivot子句中应用的任何聚合需求。

select [GBP], [USD], [CAD], [EUR] -- or [status], [GBP], [USD], [CAD], [EUR]
from  (select 'Current' as [status], SCCY, AccountedPremiumCurrent as [value] from @data
       union all
       select 'Previous', SCCY, AccountedPremiumPrevious from @data) as SourceTable
pivot (sum([value]) for SCCY in ([CAD], [EUR], [GBP], [USD])) as PivotTable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM