SQL - 对一列进行 PIVOT 并添加新列

SQL - PIVOT for one column and add new column

我是 SQL 的新手。我得到这个输入 table as

TypeId   EventDescription   FeedHeader     FeedHeaderValue
---------------------------------------------------------
 166         Financial       AllocRule         130
 166         Financial        DealID            0
 175       Partner Capital   InvestorID       OV_P1
 175         Investment        Querter          Q1
 175         Investment         DealID        offset
 175         Investment       InvestorID       OV_P2

我需要如下输出

 Financial    value     Partner Capital     value      Investment       value
-------------------------------------------------------------------------------
 AllocRule    130           InvestorID       OV_P1        Querter          Q1
 DealID        0                                          DealID           offset
                                                        InvestorID        OV_P2

不确定这是否可能。我尝试使用 pivot 但它没有提供所需的输出

 select 
 [Financial] as FinancialHeader
 , [Partner Capital] as PartnerCapitalHeader
 , [Investment] as Investmentheader
  from
 (
 select  EventDescription, FeedHeader
 from [Feeder]
 ) x
 pivot
 (
   MAX(FeedHeader)
   for EventDescription in([Financial], [Partner Capital], [Investment])
  )p

我尝试的另一种方法

Select 
    Min(Case [EventDescription] When 'Financial' Then [FeedHeader] End) 
Financial,
    Min(Case [EventDescription] When 'Financial' Then [FeedHeaderValue] End) 
 value,
     Min(Case [EventDescription] When 'Partner Capital' Then [FeedHeader] 
 End) PartnerCapital,
     Min(Case [EventDescription] When 'Partner Capital' Then 
[FeedHeaderValue] End) value,
   Min(Case [EventDescription] When 'Investment' Then [FeedHeader] End) 
 Investment,
   Min(Case [EventDescription] When 'Investment' Then [FeedHeaderValue] End) 
 value
   From [Feeder]
    Group By EventDescription

还有其他方法吗?

我很好奇,并用 PIVOT 对 SO 和 google 进行了一些研究,最后我运气好(至少我现在是这样想的)

这里的关键点是,您可以通过在末尾附加 1 或 2 来创建新的 EventDescription 值,具体取决于我们想要 PIVOT 的列数。

如果不这样做,数据透视查询将无法正常工作,并且根据我对此任务的经验会导致错误。

select max([Financial]) as FinancialHeader
     , max([Financial1]) as FinancialHeaderValue
     , max([Partner Capital]) as PartnerCapitalHeader
     , max([Partner Capital1]) as PartnerCapitalHeaderValue
     , max([Investment]) as InvestmentHeader
     , max([Investment1]) as InvestmentHeaderValue
from
 (select EventDescription,
         EventDescription+'1' as EventDescription1, 
         FeedHeader,
         FeedHeaderValue,
         row_number() over (partition by EventDescription order by EventDescription) rn
    from [testtable]
 ) x
 pivot
 (
   MAX(FeedHeader)
   for EventDescription in([Financial], [Partner Capital], [Investment])
 ) p
  pivot
 (
   MAX(FeedHeaderValue)
   for EventDescription1 in([Financial1], [Partner Capital1] , [Investment1] )
 ) v
group by [RN]

演示:db<>fiddle