2017-05-23 95 views
0

我对SQL有点新,并且被分组部分卡住了。我有一张大学的桌子,我想分组他们。下表中的东西看起来像,针对范围的SQL分组查询

Universities     Ranking 
University of Arizona   38 
Havard University    6 
RMIT       213 
University of Sheffield  106 
York University    111 
Korea University    63 
University of Melbourne  59 
University of Waterloo   78 

我想用这张表做一个新表。我的新表应该看起来像下面那样,

Ranking     No of Universities 
1-50       x 
51-99       x 
100-149      x 
so on 

如何在这种情况下进行分组?特别是在第一列的范围内。

+1

我删除了不兼容的数据库标记。请仅使用您正在使用的数据库进行标记。 –

+2

你在SQL Server或MySQL?另外,这看起来像功课。你已经尝试了什么?你究竟在干什么? –

+2

Case,Sum,Count ...这就是我要说的。 –

回答

3

喜欢的东西:

SELECT CASE 
      WHEN Ranking >= 1 AND Ranking <= 50 THEN '1-50' 
      WHEN Ranking >= 51 AND Ranking <= 100 THEN '51-100' 
     END AS Range 
,  COUNT(1) AS Number 
FROM Your_Table 
GROUP BY CASE 
      WHEN Ranking >= 1 AND Ranking <= 50 THEN '1-50' 
      WHEN Ranking >= 51 AND Ranking <= 100 THEN '51-100' 
     END 
+0

您的意思是,排名<= 50? – lk1904p

+0

@ Ik1904p有一个错误,我现在纠正了。你的意思是?我的范围有点不同于你提到的,但这是一般的想法 – HoneyBadger

+0

是现在得到它。非常感谢。 – lk1904p

0

因为你可以按照以下查询高校的动态列表:

;with cte as (--Tally table to get list of numbers 
    select top (select (max(ranking)/50)+1 from youruniversity) rowN = (row_number() over (order by (select null)) *50)-50 from master..spt_values n1, master..spt_values n2 
), cte2 as ( --We can avoid this cte by adding and subtracting in first cte, you can do that 
    select concat(RowN+1 , '-', lead(rown,1,rown+50) over (order by RowN)) as [Range], RowN+1 as Startid, lead(rown,1,rown+50) over (order by RowN) as EndId 
    from cte 
) --Final query just by group by 
select [Range] as [Ranking], count(distinct Universtities) as [No Of Universities] 
from cte2 cross join youruniversity 
where ranking > startid and ranking <= endid 
group by [range] 

输出如下:

+---------+--------------------+ 
| Ranking | No Of Universities | 
+---------+--------------------+ 
| 1-50 |     2 | 
| 101-150 |     2 | 
| 201-250 |     1 | 
| 251-300 |     1 | 
| 51-100 |     3 | 
+---------+--------------------+ 

对于如下输入:

create table youruniversity (Universtities varchar(50), Ranking int) 

insert into youruniversity (Universtities, Ranking) values 
('University of Arizona ',  38 ) 
,('Havard University  ',  6 ) 
,('RMIT     ',  213) 
,('University of Sheffield',  106) 
,('York University  ',  111) 
,('Korea University  ',  63 ) 
,('University of Melbourne',  59 ) 
,('University of Waterloo ',  78 ) 
,('Madurai Kamaraj University',  280) --added for testing 
0

你想50号范围的群体,所以用一些数学来获得组:

select 
    trunc((ranking - 1)/50) * 50 + 1 as ranking_from, 
    trunc((ranking - 1)/50) * 50 + 50 as ranking_till, 
    count(*) as no_of_universities 
from mytable 
group by trunc((ranking - 1)/50) 
order by trunc((ranking - 1)/50); 
1

我建立一个测试表与您的数据。

CREATE TABLE #TmpUni (
    Uni varchar(100) 
    ,Ranking smallint); 

INSERT INTO #TmpUni 
SELECT 'University of Arizona', 38 
INSERT INTO #TmpUni 
SELECT 'Havard University', 6 
INSERT INTO #TmpUni 
SELECT 'RMIT', 100 
INSERT INTO #TmpUni 
SELECT 'University of Sheffield', 106 
INSERT INTO #TmpUni 
SELECT 'York University', 111 
INSERT INTO #TmpUni 
SELECT 'Korea University', 63 
INSERT INTO #TmpUni 
SELECT 'University of Melbourne', 59 
INSERT INTO #TmpUni 
SELECT 'University of Waterloo', 78; 

WITH CTE AS (
    SELECT 
     Ranking = CASE WHEN Ranking BETWEEN 1 AND 50 THEN '1-50' 
         WHEN Ranking BETWEEN 51 AND 99 THEN '51-99' 
         WHEN Ranking BETWEEN 100 AND 150 THEN '100 - 150' 
        END 
     ,Uni 
    FROM #TmpUni) 

SELECT DISTINCT 
    Ranking 
    ,COUNT (Uni) OVER (PARTITION BY Ranking) AS NumberOfUniversities 
FROM CTE