2017-05-23 5 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

사례, 합계, 백작 ... 그게 전부입니다. –

답변

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

I 설치 테스트 테이블을 데이터와 함께.

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