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

标签 sql sql-server tsql pivot

我刚刚学会了如何在 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/

相关文章:

c# - 基于 sql server : . NET 中的两个字段不同

sql-server - CTE 和 FOR XML 生成嵌套的 XML

sql - 动态SQL生成列名?

sql - 更改 SQLite3 中的值

mysql - 从不同的表中选择两个不同的数据并显示值

mysql - Count() 返回 0 而不是 NULL

sql-server - 为什么我的全文搜索没有结果?

java - MySQL 不使用 netbeans 将插入推送到数据库中

c# - 系统.Data.SqlTypes.SqlTypeException : SqlDateTime overflow

sql - 关于序列或唯一标识符的令人困惑的 t-sql 考试答案