佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1416|回复: 9

sql group by few range

[复制链接]
发表于 22-2-2008 05:58 PM | 显示全部楼层 |阅读模式
各位高手,我有一个难题。。。。
我想弄一个SQL Query Group By Few Range....

比如说 : 1 ~ 100
我要Group by 0 ~ 10 , 11 ~ 20, 21 ~ 30 ..........
0 ~ 10 = ***
11 ~ 20= ***
21~30=***
31~40=***
41~50=***
51~60=***
61~70=***
71~80=***
81~90=***
91~100=***

总共会有10个Result.....

Example Group By Query(one range) :-
SELECT  GroupLevel AS DLevel, COUNT(DataNum) AS TTotal
FROM DataInfo
GROUP BY GroupLevel
ORDER BY GroupLevel

我想了好久,只有一个办法。。。直接做10个 "select query" ....
感觉好奇怪
你们还有什么建议/意见吗?
回复

使用道具 举报


ADVERTISEMENT

发表于 23-2-2008 07:27 AM | 显示全部楼层

回复 1# waizai 的帖子

写10个query太不flexible 了
不如写一个stored proc,把那些range fields insert 去temp table
然后才select 出来?
回复

使用道具 举报

发表于 23-2-2008 04:18 PM | 显示全部楼层
原帖由 waizai 于 22-2-2008 05:58 PM 发表
各位高手,我有一个难题。。。。
我想弄一个SQL Query Group By Few Range....

比如说 : 1 ~ 100
我要Group by 0 ~ 10 , 11 ~ 20, 21 ~ 30 ..........
0 ~ 10 = ***
11 ~ 20= ***
21~30=***
31~40=***
41 ...



TRY THIS EXAMPLE
*************************

SELECT
    CASE
      WHEN RANGE BETWEEN 0 AND 10
        THEN '0 - 10'
      WHEN RANGE BETWEEN 11 AND 20
        THEN '11 - 20'
      WHEN RANGE BETWEEN 21 AND 30
        THEN '21 - 30'
      WHEN RANGE BETWEEN 31 AND 40
        THEN '31 - 40'
      WHEN RANGE BETWEEN 41 AND 50
        THEN '41 - 50'
      WHEN RANGE BETWEEN 51 AND 60
        THEN '51 - 60'
      WHEN RANGE BETWEEN 61 AND 70
        THEN '61 - 70'
      WHEN RANGE BETWEEN 71 AND 80
        THEN '71 - 80'
      WHEN RANGE BETWEEN 81 AND 90
        THEN '81 - 90'
      WHEN RANGE BETWEEN 91 AND 100
        THEN '91 - 100'
      ELSE 'UNKNOWN'
    END
      AS RANGE,
    COUNT(*) AS TOTAL
  FROM ABC
  GROUP BY
    CASE
      WHEN RANGE BETWEEN 0 AND 10
        THEN '0 - 10'
      WHEN RANGE BETWEEN 11 AND 20
        THEN '11 - 20'
      WHEN RANGE BETWEEN 21 AND 30
        THEN '21 - 30'
      WHEN RANGE BETWEEN 31 AND 40
        THEN '31 - 40'
      WHEN RANGE BETWEEN 41 AND 50
        THEN '41 - 50'
      WHEN RANGE BETWEEN 51 AND 60
        THEN '51 - 60'
      WHEN RANGE BETWEEN 61 AND 70
        THEN '61 - 70'
      WHEN RANGE BETWEEN 71 AND 80
        THEN '71 - 80'
      WHEN RANGE BETWEEN 81 AND 90
        THEN '81 - 90'
      WHEN RANGE BETWEEN 91 AND 100
        THEN '91 - 100'
      ELSE 'UNKNOWN'
    END
  ORDER BY MIN(RANGE)
回复

使用道具 举报

发表于 23-2-2008 05:14 PM | 显示全部楼层
尽量不要hard coding
改次你很难expand 你的functionality
回复

使用道具 举报

发表于 23-2-2008 05:16 PM | 显示全部楼层
打个比方,如果你的data range 是0 - 1000, 一个interval 是10
难道你要hard code 100 次?
回复

使用道具 举报

 楼主| 发表于 25-2-2008 10:10 AM | 显示全部楼层

回复 3# shinchanawang 的帖子

谢谢你的coding, 我会试试看。。。。。
回复

使用道具 举报

Follow Us
 楼主| 发表于 25-2-2008 10:12 AM | 显示全部楼层
我有想过用stored proc, 等下也会试试看。。。。
谢谢~
回复

使用道具 举报

发表于 17-3-2008 02:01 AM | 显示全部楼层
介绍你另外一个方法也是用 CASE 的,比较简单。

SELECT
COUNT(CASE WHEN RANGE>=0 AND RANGE <= 10 THEN 1 END) AS 0_10_TOTAL,
.
.
.
COUNT(CASE WHEN RANGE>=91 AND RANGE <= 100 THEN 1 END) AS 91_100_TOTAL
FROM XX_TABLE

记得 CASE WHEN 里面不要ELSE 0 存在,否则 COUNT 就会错,变成 COUNT (*)  去了。
回复

使用道具 举报


ADVERTISEMENT

发表于 17-3-2008 03:09 PM | 显示全部楼层
更容易的方法.
SELECT FLOOR((my_table.index - 1) / 10) AS group_level, count(*)  AS group_count
FROM my_table
GROUP BY group_level
ORDER BY group_level
回复

使用道具 举报

发表于 17-3-2008 11:56 PM | 显示全部楼层
原帖由 kfchai1982 于 17-3-2008 03:09 PM 发表
更容易的方法.
SELECT FLOOR((my_table.index - 1) / 10) AS group_level, count(*)  AS group_count
FROM my_table
GROUP BY group_level
ORDER BY group_level


又学到东西。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 19-6-2024 12:09 PM , Processed in 0.070053 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表