我在使用sql脚本时遇到了麻烦:
SELECT A, B, C,
CASE WHEN D < 21 THEN '0<20'
WHEN D < 51 THEN '21-50'
WHEN D < 101 THEN '51-100'
ELSE '>101' END AS E
COUNT(*) FROM TABLE_X
GROUP BY A, B, C, D;
这样的结果集;
A B C D count(*)
CAR 1 2 21-50 1
CAR 1 2 21-50 1
BIKE 1 3 0-20 1
第一排是CAR,D = 25.所以它在21-50之间。 然后第二行是CAR,D = 32.所以它也在21-50之间。
我很想得到如上所述的结果:
A B C D count(*)
CAR 1 2 21-50 2
BIKE 1 3 0-20 1
因此,通过使用D列分组,CAR必须为2。
我该如何保证?
答案 0 :(得分:1)
以下查询应该有效。基本上,我只是将count(1)函数和group by子句拉到外部查询,同时将所有其余功能留给内部查询。
SELECT A,B,C,E, count(1) from
(
SELECT A, B, C,
CASE WHEN D < 21 THEN '0<20'
WHEN D < 51 THEN '21-50'
WHEN D < 101 THEN '51-100'
ELSE '>101' END AS E
FROM TABLE_X
)
GROUP BY A, B, C, E;
答案 1 :(得分:1)
按D计算分组,而不是D本身,如下:
SELECT A, B, C,
CASE WHEN D < 21 THEN ' 0-20'
WHEN D < 51 THEN '21-50'
WHEN D < 101 THEN '51-100'
ELSE '>101' END AS E
,COUNT(*) as "Coun"
FROM TABLE_X
GROUP BY A, B, C,
CASE WHEN D < 21 THEN ' 0-20'
WHEN D < 51 THEN '21-50'
WHEN D < 101 THEN '51-100'
ELSE '>101' END
产生这个
A B C E Count
---- ----------- ----------- ------ -----------
BIKE 1 3 0-20 1
CAR 1 2 21-50 2
在SQL Server 2012中在加载了这些值的表上运行时:
values
('CAR', 1,2,22)
,('CAR', 1,2,23)
,('BIKE',1,3,2)
答案 2 :(得分:1)
此处的问题是,您首先按D
进行分组,然后才应用case
逻辑。如果您将D
添加到选择列表中,则会看到可能如下所示的结果:
A B C D E count(*)
CAR 1 2 20 21-50 1
CAR 1 2 30 21-50 1
BIKE 1 3 7 0-20 1
为了避免这种情况,您可以首先应用case
,然后使用子查询来应用group by
子句:
SELECT A, B, C, E, COUNT(*)
FROM (SELECT A, B, C,
CASE WHEN D < 21 THEN '0<20'
WHEN D < 51 THEN '21-50'
WHEN D < 101 THEN '51-100'
ELSE '>101' END AS E
FROM TABLE_X) t
GROUP BY A, B, C, E;
答案 3 :(得分:0)
您还可以尝试以下查询:
SELECT A, B, C,
CASE WHEN D < 21 THEN '0<20'
WHEN D < 51 THEN '21-50'
WHEN D < 101 THEN '51-100'
ELSE '>101' END AS E
COUNT(*) FROM TABLE_X
GROUP BY 1,2,3,4;
我们使用SQL GROUP BY子句按结果集中的相对位置进行分组,其中结果集中的第一个字段为1.下一个字段为2,依此类推。