[英]Pivoting on multiple columns ang grouping by two columns
我有一个表格,其中的数据形状如下图所示,我还包含一些脚本来轻松创建和填充它以进行实验。
IF OBJECT_ID('tempdb..#temptable') IS NOT NULL DROP TABLE #temptable;
CREATE TABLE #temptable ([RiskName] VARCHAR(50)
, [RiskName_Change] VARCHAR(50)
, [PriceVal] DECIMAL(8, 2)
, [PriceVal_Change] DECIMAL(8, 2)
, [Portfolio] NVARCHAR(200)
, [benchmark] NVARCHAR(200)
, [EffectiveDate] DATE);
INSERT INTO #temptable ([RiskName], [RiskName_Change], [PriceVal], [PriceVal_Change], [Portfolio], [benchmark], [EffectiveDate])
VALUES ('OilPrice', 'OilPrice_CHANGE', 120.00, 5.50, N'PORT45', N'SP500', N'2022-06-02T00:00:00')
, ('StocksCrash', 'StocksCrash_CHANGE', 340.00, 600.00, N'PORT45', N'SP500', N'2022-06-02T00:00:00')
, ('SupplyChain', 'SupplyChain_CHANGE', 710.00, 23.45, N'PORT45', N'SP500', N'2022-06-02T00:00:00')
, ('OilPrice', 'OilPrice_CHANGE', 110.00, 15.50, N'PORT45', N'SP500', N'2022-06-01T00:00:00')
, ('StocksCrash', 'StocksCrash_CHANGE', 240.00, 500.00, N'PORT45', N'SP500', N'2022-06-01T00:00:00')
, ('SupplyChain', 'SupplyChain_CHANGE', 400.00, 123.00, N'PORT45', N'SP500', N'2022-06-01T00:00:00')
, ('SupplyChain', 'SupplyChain_CHANGE', 300.00, 82.40, N'PORT45', N'SP500', N'2022-05-31T00:00:00')
我想我需要的是两个pivots
? 但我不太确定。 但是我需要的最终结果应该如下所示:请注意,每一行都基于Portfolio
和EffectiveDate
,然后如果存在风险或风险变化,则将其转换为列。 另请注意,实际上可能是其中的 20 个风险,我只是添加了三个风险进行演示。
Portfolio | EffectiveDate | Becnhmark | OilPrice | OilPrice_Change | StocksCrash | StocksCrash_Change | SupplyChain | SupplyChain_Change |
PORT45 | 2022-06-02 | SP500 | 120.00 | 5.50 | 340.00 | 600.00 | 710.00 | 23.45 |
PORT45 | 2022-06-01 | SP500 | 110.00 | 15.50 | 240.00 | 500.00 | 400.00 | 123.00 |
PORT45 | 2022-05-31 | SP500 | NULL | NULL | NULL | NLL | 300.00 | 82.40 |
您可以使用条件聚合,而不是使用非常不灵活的PIVOT
。
不清楚你想要什么样的聚合?
SUM
MIN
别的什么?
SELECT
t.Portfolio,
t.benchmark,
t.EffectiveDate,
OilPrice = SUM(CASE WHEN RiskName = 'OilPrice' THEN PriceVal END),
OilPrice_CHANGE = MIN(CASE WHEN RiskName_Change = 'OilPrice' THEN PriceVal_Change END),
StocksCrash = SUM(CASE WHEN RiskName = 'StocksCrash' THEN PriceVal END),
StocksCrash_CHANGE = MIN(CASE WHEN RiskName_Change = 'StocksCrash_CHANGE' THEN PriceVal_Change END),
SupplyChain = SUM(CASE WHEN RiskName = 'SupplyChain' THEN PriceVal END),
SupplyChain_CHANGE = MIN(CASE WHEN RiskName_Change = 'SupplyChain_CHANGE' THEN PriceVal_Change END)
FROM #temptable t
GROUP BY
t.Portfolio,
t.benchmark,
t.EffectiveDate
ORDER BY
t.Portfolio,
t.benchmark,
t.EffectiveDate DESC;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.