如何使用SQL对一列的值为< = x的行数进行分组和计数,另一列的值为> X?

时间:2010-07-13 11:41:50

标签: sql

我想对符合条件colA <= x < colB的表格中的条目数进行分组和计数

假设我有下表:

index  Game            MinAgeInclusive   MaxAgeExclusive
--------------------------------------------------------
1      Candy Land      3                 8
2      Checkers        5                 255
3      Chess           12                255
4      Sorry!          6                 12
5      Monopoly        10                30

(这不是我正在做的事情,但它通过我的设置抽象了许多其他并发症)

假设我想要一张表格,告诉我有多少游戏适合不同年龄段:

Age    NumberOfAgeAppropriateGames
----------------------------------
0      0 
...
3      1 
4      1 
5      2
6      3
7      3
8      2
9      2
10     3
...
40     2

我当然可以获得单一年龄的价值:

SELECT 
COUNT(*) 
FROM GameTable 
WHERE MinAgeInclusive <= age AND age < MaxAgeExclusive

我知道如何获得具有给定MaxAgeExclusive

的项目数
SELECT
MaxAgeExclusive, COUNT(*) AS GameCount
FROM GameTable
GROUP BY MaxAgeExclusive

但我无法弄清楚如何做到这两点。

由于我的实际应用程序是在包含数百万个条目的表上执行此操作,并且可能必须确定数千个x值的计数,所以我希望通过完成所有操作可以最大限度地提高性能一个查询。

2 个答案:

答案 0 :(得分:6)

要以一种相当通用的方式执行此操作,您可能最好为此创建一个辅助数字表,其中包含从0到最大值的数字序列,然后使用类似下面的内容。

SELECT 
COUNT(*)  AS GameCount, N.Number
FROM Numbers N 
       LEFT OUTER JOIN GameTable ON 
            MinAgeInclusive <= N.Number AND N.Number < MaxAgeExclusive
WHERE N.Number < 100
GROUP BY N.Number

答案 1 :(得分:1)

检查的年龄范围将在10到50之间。

   WITH Age_Tbl
    AS
    (
      SELECT 10 AS Age
      UNION ALL
      SELECT Age+1
      FROM Age_Tbl
      WHERE Age+1 <= 50
    )
    SELECT Age, 
    (select COUNT(*) 
    FROM GameTable G
    WHERE  A.Age between G.Min and G.Max) NumberOfAgeAppropriateGames
 from Age_Tbl A

编辑:正如Martin Smith评论的那样,它只能在MS SQL Server中使用。