如何在SQL查询中将SQL结果作为不同的集合获取

时间:2016-09-07 07:06:46

标签: sql sql-server

我有以下要求:通过使用SQL IN子句获得前20名记录。我的问题是

Select CatId,Name,Color 
from Table1 
where CatId in (10,11,12)

,结果就像

 CatId  | Name   | Color
 ------- -------- ------
 10       Name1    Blue
 10       Name2    red
 10       Name3    Blue
 11       Name4    Blue
 10       Name5    red
 12       Name6    Blue
 11       Name7    Blue
 12       Name8    Blue
 .......

但是我需要像集合这样的结果 CatIds in(10,11,12)

CatId  | Name   | Color
 ------- -------- ------
 10       Name1    Blue
 11       Name4    Blue
 12       Name6    Blue
 10       Name2    Red
 11       Name7    red
 12       Name8    Blue   
 ......

SQL查询中有什么办法可以告诉我吗?

4 个答案:

答案 0 :(得分:6)

您可以使用ROW_NUMBER

的查询
Select CatId, Name, Color
from (
   Select CatId, Name, Color,
          row_number() over (partition by CatId order by Name) AS rn 
   from mytable 
   where CatId in (10,11,12)) as t
order by rn, Name

上述查询使用带有ROW_NUMBER子句的PARTITION BY,以便枚举具有相同CatId的切片的记录。因此,例如,CatId = 10的记录被分配了数字1, 2, 3, ...,而CatId = 11的记录同样被分配了数字1, 2, 3, ...,因此没有。{使用这些数字,我们可以创建一个所需的订单。

答案 1 :(得分:1)

如果我理解,

试试这个(我假设CatId是数字):

Select CatId, Name, Color 
from Table1 T
where CatId in (10,11,12)
order by CatId + CatId * ISNULL(
    (SELECT COUNT(*) FROM Table1 T1
    WHERE T.CatId = T1.CatId
    AND T.Name > T1.Name), 0)

答案 2 :(得分:0)

试试这个:

Select CatId,Name,Color 
from Table1 
where CatId in (10,11,12) order by Color, CatID

答案 3 :(得分:0)

试试这个:

SELECT ROW_NUMBER() OVER (PARTITION BY catId ORDER BY catId ) as rowNumber, * FROM Table1
WHERE catId in (10,11,12)
ORDER BY rowNumber