gpt4 book ai didi

sql - 当我们在 SQL Server 中对文本列进行透视时,为什么要使用 Max 函数?

转载 作者:行者123 更新时间:2023-12-02 23:52:15 25 4
gpt4 key购买 nike

我刚刚学会了如何在 SQL Server 中进行数据透视。我想知道当我们想要旋转文本列时为什么要使用 max 函数?这背后的逻辑是什么?我知道它是否是 CountSum 等(因为您对相应的行和列求和),但我不明白使用 max 的逻辑当我们有文本列时?

例如我的代码是:

SELECT * 
FROM ( SELECT DATE
,SITA
,EVENT
FROM [UKRMC].[dbo].[strategy]
where datename(year, DATE) = 2018 or datename(year,DATE)=2019
) strategy
PIVOT ( max(EVENT)
FOR SITA IN ([ABZPD],[BFSPD]
,[BFSZH]
,[BHXPD]
,[BHXZH]
,[BRSZH]
,[BRUPQ] ) piv

最佳答案

因为在您的示例中您选择了 EVENT作为要在 PIVOT 交叉点中显示的值(即,由于您已在 EVENT 子句中指定了 PIVOT),因此必须使用 permissible aggregate functions 之一指定该值。 ,因为当按剩余列(即您的情况中的 DATE)分组时,您在数据透视表中选择的每个列值可能有多个行。

在 Sql Server 中[1]MAX()MIN()在旋转非数字列时通常使用,因为它能够显示该列的原始值之一。

任何非聚合和非透视列都将保持原样,并将用于形成透视所基于的组(在您的情况下,列 DATE 不在聚合中,或者列枢轴,因此它将形成行组)

考虑这样的情况:您的数据透视表包含与您的谓词匹配的多行,如下所示:

INSERT INTO strategy (DATE, SITA, EVENT) VALUES
('1 Jan 2018', 'ABZPD', 'Event1'),
('1 Jan 2018', 'BFSPD', 'Event2'),
('1 Jan 2018', 'BFSPD', 'Event3');

枢轴后:

DATE                    ABZPD   BFSPD
2018-01-01T00:00:00Z Event1 Event3

即在枢轴期间,BFSPD Event2 的行和Event3需要以某种方式转换到单个细胞中 - 因此需要聚合。即使已知只有 one value,这个聚合仍然是需要的。 (上例中 SITA Event1ABZPD 值就是这种情况)。

BFSPD有两个事件,您需要以某种方式解决如何将值投影到单个单元格值中的问题。使用MAX如果多行投影到同一结果数据透视“单元格”中,则 VARCHAR 列上的 解析“最大”值 ( Event3 ) - SqlFiddle example here

您可以选择使用COUNT(Event)显示每行/枢轴交叉点的事件数 - Fiddle

您可以将聚合切换为 EVENTDATE -EVENT因此在 column grouping 中使用.

<小时/>

*1 聚合如 AVGSTDEV显然不适用于字符串。其他 RDBMS 有额外的聚合,例如 FIRST它将任意取第一个值,或 GROUP_CONCAT / LIST_AGG ,它可以将字符串值与分隔符折叠在一起。和PostGres允许您创建自己的聚合函数!但遗憾的是,SqlServer 中没有这些,因此 MIN()/MAX() 现在。

关于sql - 当我们在 SQL Server 中对文本列进行透视时,为什么要使用 Max 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48078190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com