范围的SQL分组查询

范围的SQL分组查询,sql,oracle,Sql,Oracle,我对SQL有点陌生,而且我一直坚持使用分组部分。我有一张大学的桌子,我想把它们分组。这张桌子看起来像下面 Universities Ranking University of Arizona 38 Havard University 6 RMIT 213 University of Sheffield 106 York University

我对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
在这种情况下,如何进行分组?特别是第一列中的范围

类似于:

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有一个拼写错误,我现在已经更正了。你是那个意思吗?我的范围与你提到的有点不同,但这是总体思路