繁体   English   中英

以多列为中心,按两列分组

[英]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 但我不太确定。 但是我需要的最终结果应该如下所示:请注意,每一行都基于PortfolioEffectiveDate ,然后如果存在风险或风险变化,则将其转换为列。 另请注意,实际上可能是其中的 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;

db<>小提琴

暂无
暂无

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

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