Sql 基于范围从同一表的两个不同列进行计数

Sql 基于范围从同一表的两个不同列进行计数,sql,Sql,我有这样的啤酒: MONTHS CUST CATEGORY 10 1 1 20 2 1 10 3 NULL 30 4 1 40 5 NULL 我想根据范围统计客户数量和类别数量 例如: 在10-19范围内,客户数量为2,类别为1。 请提供帮助。您可以使用如下查询: SELECT CASE WHEN MONTHS B

我有这样的啤酒:

MONTHS  CUST    CATEGORY
10       1          1
20       2          1
10       3         NULL
30       4          1
40       5          NULL
我想根据范围统计客户数量和类别数量

例如:
在10-19范围内,客户数量为2,类别为1。
请提供帮助。

您可以使用如下查询:

SELECT CASE 
            WHEN MONTHS BETWEEN 10 AND 19 THEN '10-19'
            WHEN MONTHS BETWEEN 20 AND 29 THEN '20-29'
            WHEN MONTHS BETWEEN 30 AND 39 THEN '30-39'
            WHEN MONTHS BETWEEN 40 AND 49 THEN '40-49'
            ELSE '50-'
         END,
         COUNT(CUST) AS CUST_COUNT,
         COUNT(CATEGORY) AS CATEGORY_COUNT
FROM mytable
GROUP BY CASE 
            WHEN MONTHS BETWEEN 10 AND 19 THEN '10-19'
            WHEN MONTHS BETWEEN 20 AND 29 THEN '20-29'
            WHEN MONTHS BETWEEN 30 AND 39 THEN '30-39'
            WHEN MONTHS BETWEEN 40 AND 49 THEN '40-49'
            ELSE '50-'
         END

只要可以计算出在整个范围内产生相同值的分组表达式,就可以使用分组依据:

Select
     (MONTHS - (MONTHS % 10)) As RANGE
   , Count(CUST)              As CUST_COUNT,
   , Count(CATEGORY)          As CATEGORY_COUNT
From
     tbale --< :-)
Group By
     (MONTHS - (MONTHS % 10)); --< Expression that would result in the same value for the entire RANGE
选择
(月-(月%10))作为范围
,将(客户)计数为客户计数,
,将(类别)计数为类别计数
从…起
tbale——<:-)
分组
(月-(月%10));——<表达式,该表达式将在整个范围内产生相同的值

Giorgos Betsos的答案调整为使用派生表。无需键入该
大小写
表达式两次。符合ANSI SQL(因为在
GROUP BY
子句中只允许列。)

select MONTHS, COUNT(CUST) AS CUST_COUNT, COUNT(CATEGORY) AS CATEGORY_COUNT
from
(
    SELECT CASE 
                WHEN MONTHS BETWEEN 10 AND 19 THEN '10-19'
                WHEN MONTHS BETWEEN 20 AND 29 THEN '20-29'
                WHEN MONTHS BETWEEN 30 AND 39 THEN '30-39'
                WHEN MONTHS BETWEEN 40 AND 49 THEN '40-49'
                ELSE '50-'
             END AS MONTHS,
         CUST,
         CATEGORY
    FROM mytable
)
GROUP BY MONTHS