需要帮助将行转列
Need help to transpose rows to columns
我很抱歉要求别人为我编写我的代码,但为了让枢轴运算符在 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...
”查询中使用一个联合,但我希望它能与数据透视运算符一起使用。
我觉得我的大脑无法处理执行此操作所需的逻辑,因此我正在寻求帮助。一旦我得到这个,我将能够像专业人士一样重新应用它...
使用 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
您可以使用以下查询来完成:
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
PIVOT
在多个列上,例如 AccountedPremiumCurrent
,AccountedPremiumPrevious
在您的情况下在 SQL 服务器中是不可能的。因此,在应用 PIVOT
之前,CROSS APPLY
技巧用于 unpivot 这两列。
在上述查询产生的输出中,col
对于来自 AccountedPremiumCurrent
的值等于 current
,对于来自 [=] 的值等于 previous
13=]。
如果您需要动态数据透视表(其中列值事先未知),您可以执行以下查询。
首先声明一个变量来动态获取列值
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
- Click here 查看结果
您的来源 table 不能包含两个要作为基础的字段,因此将它们与其他一些任意数据结合在一起以区分它们(在下面的例子中,[status]
字段是 'Current'
或 'Previous'
)。完成后,在数据透视子句中应用任何需要应用的聚合。
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
我很抱歉要求别人为我编写我的代码,但为了让枢轴运算符在 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...
”查询中使用一个联合,但我希望它能与数据透视运算符一起使用。
我觉得我的大脑无法处理执行此操作所需的逻辑,因此我正在寻求帮助。一旦我得到这个,我将能够像专业人士一样重新应用它...
使用 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
您可以使用以下查询来完成:
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
PIVOT
在多个列上,例如 AccountedPremiumCurrent
,AccountedPremiumPrevious
在您的情况下在 SQL 服务器中是不可能的。因此,在应用 PIVOT
之前,CROSS APPLY
技巧用于 unpivot 这两列。
在上述查询产生的输出中,col
对于来自 AccountedPremiumCurrent
的值等于 current
,对于来自 [=] 的值等于 previous
13=]。
如果您需要动态数据透视表(其中列值事先未知),您可以执行以下查询。
首先声明一个变量来动态获取列值
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
- Click here 查看结果
您的来源 table 不能包含两个要作为基础的字段,因此将它们与其他一些任意数据结合在一起以区分它们(在下面的例子中,[status]
字段是 'Current'
或 'Previous'
)。完成后,在数据透视子句中应用任何需要应用的聚合。
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