SQL Pivot 分组问题

Posted

技术标签:

【中文标题】SQL Pivot 分组问题【英文标题】:SQL Pivot Grouping Issue 【发布时间】:2014-10-07 23:53:46 【问题描述】:

我有一个包含几个简单规则的考试数据表。考试有许多基于地理和大小的不同轨道。问题是否可见取决于称为可见性的布尔列,该列填充为零表示“不可见”或填充为 1 表示“可见”。

问题 | 跟踪 | 可见性

问题_A |北_大 | 0 问题_A | South_Small | 1 问题_A | East_Med.... | 1 问题_B |北_大 | 1 问题_B | South_Small | 1 问题_B | East_Med.... | 1

我的 Pivot 代码如下所示:

SELECT *
Into Track_Pivoted
FROM Track_Creation
PIVOT
(
  COUNT(Visibility)
  FOR [Track] IN ([Question A],[Question B]) as _pivoted

问题是,在结果表 Track_Pivoted Question A 中,North_Large 显示为 1,而在我从中选择的原始表中为 0。

我觉得这应该是正确的,但不确定发生了什么。我上面的例子是我的实际数据的简化版本,它有 40 首曲目的几百个问题,但我觉得我已经准确地表示了这个问题。

我们将不胜感激任何正确方向的帮助。

【问题讨论】:

我不太明白你想要的输出;也许这就是你想要的:sqlfiddle.com/#!3/15d58/25 ? 【参考方案1】:

原因是您将 COUNT 用于聚合函数。它看到一个带有 North_Large 的 Question_A 的行,因此它返回 1。您可能需要将 COUNT 更改为 MAXSUM

【讨论】:

【参考方案2】:

不确定您希望使用哪种方式进行数据透视,但您现有的查询存在 3 个问题:

    使用 COUNT() 将在所有单元格中产生 1。请改用 MAX()。 您正在将 [Track] 与 [Question] 的值进行比较 您要比较的值与数据不符(例如,下划线 A、not、空格 A)

所以,这里有两种选择:

转向问题:

SELECT *
FROM Track_Creation
PIVOT
(
  MAX(Visibility)
  FOR [Question] IN ([Question_A],[Question_B]) 
 ) as pivoted
;
|        TRACK | QUESTION_A | QUESTION_B |
|--------------|------------|------------|
| East_Med.... |          1 |          1 |
|  North_Large |          0 |          1 |
|  South_Small |          1 |          1 |

重回正轨:

SELECT *
FROM Track_Creation
PIVOT
(
  MAX(Visibility)
  FOR [Track] IN ([North_Large],[East_Med....],[South_Small]) 
 ) as pivoted
;
|   QUESTION | NORTH_LARGE | EAST_MED.... | SOUTH_SMALL |
|------------|-------------|--------------|-------------|
| Question_A |           0 |            1 |           1 |
| Question_B |           1 |            1 |           1 |

See this SQLFiddle demo

【讨论】:

以上是关于SQL Pivot 分组问题的主要内容,如果未能解决你的问题,请参考以下文章

计算 Pivot SQL 中的总天差

SQL Pivot 未对所有结果求和

SQL Server 动态行转列(参数化表名分组列行转列字段字段值)

如何在结果集中使用 2 个分组列进行 PIVOT?

按移位的 DATETIME 字段和按 ID 的 PIVOT 分组

SQL Server 动态行转列(参数化表名分组列行转列字段字段值)