0

全部,

抱歉 - 这可能是一个非常简单的 SQL 问题,但我不知道如何编写谷歌搜索来获得我需要的东西。

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

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' 的行的总点数是多少?

使用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 解决方案会更好......)

提前致谢!

4

3 回答 3

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
于 2013-03-05T13:49:26.337 回答
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
于 2013-03-05T13:48:36.590 回答
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
于 2013-03-05T13:48:43.580 回答