如何编写一个SQL查询,为每个可能的字段值创建一个单独的列?

时间:2013-03-05 13:45:15

标签: sql sql-server

所有

抱歉 - 这可能是一个简单的简单SQL问题,但我无法弄清楚如何编写Google搜索来获取我需要的内容。

我有一个看起来像这样的表:

id   color  points
---  -----  ------
  1  red        10
  2  blue       20
  3  blue       30
  4  red       100
  5  blue       70
  6  blue      200
  7  red        30

我想知道两件事:

  1. 有多少行有color ='red',有多少有color ='blue'?
  2. color ='red'和color ='blue'的行的总点数是多少?
  3. 使用count()sum()group by,我可以轻松创建如下所示的结果集:

    select
        color,
        count(color),
        sum(points)
    from
        my_table
    group by
        color
    
    color  count  points
    -----  -----  ------
    red        3     140
    blue       4     320
    

    然而,我真正想要的是一行结果如下:

    red_count  red_points  blue_count  blue_points
    ---------  ----------  ----------  -----------
            3         140           4          320
    

    对于它的价值 - 我理想的查询不需要灵活处理不确定数量的不同颜色;假设总是只有两种颜色,我100%好。

    另外 - 在这种情况下,我正在使用SQL Server,如果解决方案使用特定于此的东西,我就可以了。 (当然,通用的SQL解决方案会更好......)

    提前致谢!

3 个答案:

答案 0 :(得分:3)

尝试此通用查询:

SELECT SUM(CASE WHEN color='red' THEN 1 ELSE 0 END) red_count
      ,SUM(CASE WHEN color='red' THEN points ELSE 0 END) red_points
      ,SUM(CASE WHEN color='blue' THEN 1 ELSE 0 END) blue_count
      ,SUM(CASE WHEN color='blue' THEN points ELSE 0 END) blue_points
FROM yourTable

答案 1 :(得分:3)

SELECT  SUM(CASE WHEN color = 'red' THEN 1 ELSE 0 END) red_count,
        SUM(CASE WHEN color = 'red' THEN points ELSE 0 END) red_points,
        SUM(CASE WHEN color = 'Blue' THEN 1 ELSE 0 END) blue_count,
        SUM(CASE WHEN color = 'Blue' THEN points ELSE 0 END) blue_points
FROM    tableName

答案 2 :(得分:3)

您可以使用聚合和CASE表达式转移数据:

select
  sum(case when color = 'red' then 1 else 0 end) red_count,
  sum(case when color = 'red' then points end) red_points,
  sum(case when color = 'blue' then 1 else 0 end) blue_count,
  sum(case when color = 'blue' then points end) blue_points
from my_table