SQL Pivot分组问题

时间:2014-10-07 23:53:47

标签: sql sql-server sql-server-2008-r2 count pivot

我有一张考试数据表,里面有几条简单的规则。考试有许多基于地理和大小的不同轨道。一个问题是可见的或不是基于名为visibility的布尔列,该列填充为“不可见”为零或“可见”为1。

问题| 追踪| 能见度

  • 问题_A | North_Large | 0
  • Question_A | South_Small | 1
  • Question_A | East_Med .... | 1
  • Question_B | North_Large | 1
  • Question_B | South_Small | 1
  • Question_B | East_Med .... | 1

    上面透视上面的代码如下所示:

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

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

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

    非常感谢任何正确方向的帮助。

  • 2 个答案:

    答案 0 :(得分:0)

    原因是您使用COUNT作为聚合函数。对于Question_A,它会看到North_Large的一行,因此它返回1.您可能希望将COUNT更改为MAXSUM

    答案 1 :(得分:0)

    不确定您希望枢轴的方式,但您现有的查询有3个问题:

    1. 使用COUNT()将在所有单元格中生成1。请改用MAX()。
    2. 您正在将[追踪]与[问题]
    3. 的值进行比较
    4. 您所比较的值与不同意数据(例如下划线A,不是,spaceA)
    5. 所以,这里有两个选择:

      转向问题:

      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