具有多个聚合值的数据透视表

Posted

技术标签:

【中文标题】具有多个聚合值的数据透视表【英文标题】:Pivot table with multiple aggregate value 【发布时间】:2021-05-12 07:10:05 【问题描述】:

我正在尝试在表格下方进行透视,这可能吗?

但如果我按代码聚合它们,值 A 或 B 将因此而消失。

来自

Name Code Value
Kevin Code1 A
Kevin Code1 B
Kevin Code2 C
Kevin Code3 D
Tom Code1 E
Tom Code2 F
Tom Code3 G

Name Code1 Code2 Code3
Kevin A C D
Kevin B C D
Tom E F G

我试过的查询....

DECLARE @cols AS NVARCHAR(max), @query AS NVARCHAR(max);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Code) 
FROM Table c
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)'),1,1,'')

set @query = 'with mapping as 
             (SELECT 
                Name
                , ' + @cols + ' 
             from (select name
                       , Code
                       , Value
                    from Table) x
             pivot 
             (max(Code)
             for Name in (' + @cols + ')) p )' 

execute(@query)

我自己试过了,但我只能在下面实现

Name Code1 Code2 Code3
Kevin A or B(depend on aggregated max or min) C D
Tom E F G

提前致谢

【问题讨论】:

我想说这不是枢轴函数的想法。 Code1 是一个值或一个键 - 您可以对其执行聚合,或者以与使用名称相同的方式使用它。 【参考方案1】:

这是一个固定的列列表版本。您应该使用此模板构建您的动态模板。

select Name 
  , first_value(Code1) over(partition by Name order by rn) Code1
  , first_value(Code2) over(partition by Name order by rn) Code2
  , first_value(Code3) over(partition by Name order by rn) Code3
from (
   select t.* , row_number() over(partition by Name, Code order by Value) rn
   from tbl t
   ) t
pivot (max(value) for code in (Code1, Code2, Code3)) p
order by Name;

【讨论】:

我将 first_value 函数更改为 max as first_value,因为没有返回相同代码的每个值。【参考方案2】:

使用row_number() 和一些算术:

select name,
       max(case when code = 'Code1' then value end) as code1,
       max(case when code = 'Code2' then value end) as code2,
       max(case when code = 'Code3' then value end) as code3
from (select t.*,
             row_number() over (partition by name, code order by (select null)) as seqnum
      from t
     ) t
group by name, seqnum;

不清楚动态 SQL 是由于动态列数还是试图解决此问题。但这也适用于动态 SQL。

【讨论】:

以上是关于具有多个聚合值的数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

具有多列聚合的 SQL Server 数据透视表

具有非基值的数据透视表

如何查看具有实际列值的数据透视表,例如在 excel 中的访问

按日期显示多个值的数据透视表

Python:一次包含重复值的多个列的 Pandas 数据透视表

具有多个值列的数据透视表