Sql分组麻烦

时间:2014-07-22 06:11:28

标签: sql

我在使用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。

我该如何保证?

4 个答案:

答案 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,依此类推。