范围的SQL分组查询
我对SQL有点陌生,而且我一直坚持使用分组部分。我有一张大学的桌子,我想把它们分组。这张桌子看起来像下面范围的SQL分组查询,sql,oracle,Sql,Oracle,我对SQL有点陌生,而且我一直坚持使用分组部分。我有一张大学的桌子,我想把它们分组。这张桌子看起来像下面 Universities Ranking University of Arizona 38 Havard University 6 RMIT 213 University of Sheffield 106 York University
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
在这种情况下,如何进行分组?特别是第一列中的范围 类似于:
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
选择案例
当排名>=1,排名=51,排名=1,排名=51,排名时,类似于:
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
选择案例
当排名>=1且排名=51且排名=1且排名=51且排名时,对于动态大学列表,您可以如下查询:
;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
输入如下:
;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
有关大学的动态列表,您可以按以下方式查询:
;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
输入如下:
;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
您需要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);
您需要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);
我用你的数据设置了一个测试表
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
我用你的数据设置了一个测试表
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
我删除了不兼容的数据库标记。请仅使用您正在使用的数据库进行标记。您使用的是SQL Server还是MySQL?而且,这看起来像是家庭作业。你已经试过什么了?你到底在说什么?案子,总数,计数。。。这就是我要说的。我正在使用oracle toad,我相信它在SQL server上。这是一个简单的问题,我正试图找出自己。这不是家庭作业什么的。“我正在使用Oracle,我相信它在SQL Server上”毫无意义。Oracle和SQL Server是两种完全不同的数据库产品。我删除了不兼容的数据库标记。请仅使用您正在使用的数据库进行标记。您使用的是SQL Server还是MySQL?而且,这看起来像是家庭作业。你已经试过什么了?你到底在说什么?案子,总数,计数。。。这就是我要说的。我正在使用oracle toad,我相信它在SQL server上。这是一个简单的问题,我正试图找出自己。这不是家庭作业什么的。“我正在使用Oracle,我相信它在SQL Server上”毫无意义。Oracle和SQL Server是两种完全不同的数据库产品。你的意思是,在@Ik1904p排名时有一个输入错误,我现在已经更正了。你是那个意思吗?我的范围与你提到的有点不同,但这是你的意思和排名@Ik1904p有一个拼写错误,我现在已经更正了。你是那个意思吗?我的范围与你提到的有点不同,但这是总体思路