SQL Server - 如何在where子句中使用多个列值

时间:2016-08-26 04:52:09

标签: sql sql-server tsql

我有一个体育统计数据库。我希望每个赛季每个球队都能获得前五名。所以我的俱乐部有五支球队。

我有一个包含季节的专栏(1990年,1991年,1992年等)。 我有一个包含我的团队的专栏(team1,team2,team3等)。

所以我真正想要的是:

1990 team1 Jones
1990 team1 Smith
1990 team1 Cross
1990 team1 Billy
1990 team1 Alex

then

1990 team2 Craig
1990 team2 Alan
...

我需要的是在where子句中的foreach,但我知道这是错误的。

如果我没有where子句,那么它只会获得前五名。

我能做到:

where team = team1 AND season = 1990
where team = team1 AND season = 1991
...
where team = team3 AND season = 1990

但我必须为每个赛季和每支球队手动完成。我知道必须有更好的方法:)

5 个答案:

答案 0 :(得分:4)

使用 ROW_NUMBER()分区依据: Partition By会将您的数据分组到给定参数中,并为其提供唯一ID。

Declare @tblTest AS Table
(
    Id INT,
    Season INT,
    Team VARCHAR(50),
    Name VARCHAR(50)
)

INSERT INTO @tblTest VALUES(1,2001,'Team1','Name1')
INSERT INTO @tblTest VALUES(2,2001,'Team1','Name2')
INSERT INTO @tblTest VALUES(3,2001,'Team1','Name3')
INSERT INTO @tblTest VALUES(4,2001,'Team1','Name4')
INSERT INTO @tblTest VALUES(5,2001,'Team1','Name5')
INSERT INTO @tblTest VALUES(6,2001,'Team1','Name6')
INSERT INTO @tblTest VALUES(7,2001,'Team1','Name7')

INSERT INTO @tblTest VALUES(8,2002,'Team2','Name1')
INSERT INTO @tblTest VALUES(9,2002,'Team2','Name2')
INSERT INTO @tblTest VALUES(10,2002,'Team2','Name3')
INSERT INTO @tblTest VALUES(11,2002,'Team2','Name4')
INSERT INTO @tblTest VALUES(12,2002,'Team2','Name5')
INSERT INTO @tblTest VALUES(13,2002,'Team2','Name6')
INSERT INTO @tblTest VALUES(14,2002,'Team2','Name7')

SELECT 
    Id ,
    Season ,
    Team ,
    Name 
FROM
(
    SELECT 
        Id ,
        Season ,
        Team ,
        Name ,
        ROW_NUMBER() OVER(Partition BY Season,Team Order by  Season,Team,Name) AS PartNo
    FROM
    @tblTest
)X
WHERE X.PartNo<6

答案 1 :(得分:2)

希望这足以满足您的要求。只需将“Table_A”替换为您拥有的实际表名,并相应地修改列名。

;WITH TeamStat AS(
SELECT Season
    ,Team
    ,Names, PlayerScore
    ,ROW_NUMBER() OVER (PARTITION BY (Season) ORDER BY PlayerScore) AS Orders
FROM TABLE_A
)
SELECT * from TeamStat where Orders <=5

答案 2 :(得分:1)

您可以将ROW_NUMBER()等排名函数与PARTITION BY子句一起使用。

;WITH CTE AS (
             SELECT team,player,season
                    ROW_NUMBER() OVER(PARTITION BY team,season ORDER by Score DESC) as rnk
             FROM sports_stats_table
            )

SELECT team,player,season
FROM CTE
WHERE rnk <=5
ORDER BY rnk desc,season,team

为了评估选择最佳表现者的表现,我假设表格中有一个名为Score的栏目

答案 3 :(得分:1)

准备样本数据:

declare @Year table
(
    Year int
)

insert @Year values (1990), (1991), (1992)

declare @Team table
(
    Team int,
    Player varchar(10)
)

insert @Team values 
    (1, 'a'), 
    (1, 'b'),
    (1, 'c'), 
    (1, 'd'),
    (1, 'e'), 
    (1, 'f'),
    (1, 'g'), 
    (2, 'p'), 
    (2, 'q'),
    (2, 'r'), 
    (2, 's'),
    (2, 't'), 
    (2, 'u'),
    (2, 'v')

declare @Player table
(
    Id int identity,
    Year int,
    Team int,
    Name varchar(10),
    Score int
)
insert
    @Player
select 
    y.Year,
    t.Team,
    t.Player,
    60 + cast(40 * rand(checksum(newid())) as int) as Score
from 
    @Year as y
cross join
    @Team as t
order by 1, 2, 3

示例数据:

| Id | Year | Team | Name | Score |
|----|------|------|------|-------|
| 1  | 1990 | 1    | a    | 99    |
| 2  | 1990 | 1    | b    | 78    |
| 3  | 1990 | 1    | c    | 80    |
| 4  | 1990 | 1    | d    | 94    |
| 5  | 1990 | 1    | e    | 77    |
| 6  | 1990 | 1    | f    | 96    |
| 7  | 1990 | 1    | g    | 85    |
| 8  | 1990 | 2    | p    | 97    |
| 9  | 1990 | 2    | q    | 67    |
| 10 | 1990 | 2    | r    | 68    |
| 11 | 1990 | 2    | s    | 61    |
| 12 | 1990 | 2    | t    | 78    |
| 13 | 1990 | 2    | u    | 88    |
| 14 | 1990 | 2    | v    | 66    |
| 15 | 1991 | 1    | a    | 93    |
| 16 | 1991 | 1    | b    | 82    |
| 17 | 1991 | 1    | c    | 96    |
| 18 | 1991 | 1    | d    | 90    |
| 19 | 1991 | 1    | e    | 67    |
| 20 | 1991 | 1    | f    | 60    |
| 21 | 1991 | 1    | g    | 64    |
| 22 | 1991 | 2    | p    | 83    |
| 23 | 1991 | 2    | q    | 77    |
| 24 | 1991 | 2    | r    | 75    |
| 25 | 1991 | 2    | s    | 74    |
| 26 | 1991 | 2    | t    | 91    |
| 27 | 1991 | 2    | u    | 88    |
| 28 | 1991 | 2    | v    | 69    |
| 29 | 1992 | 1    | a    | 96    |
| 30 | 1992 | 1    | b    | 98    |
| 31 | 1992 | 1    | c    | 70    |
| 32 | 1992 | 1    | d    | 68    |
| 33 | 1992 | 1    | e    | 84    |
| 34 | 1992 | 1    | f    | 70    |
| 35 | 1992 | 1    | g    | 87    |
| 36 | 1992 | 2    | p    | 60    |
| 37 | 1992 | 2    | q    | 77    |
| 38 | 1992 | 2    | r    | 76    |
| 39 | 1992 | 2    | s    | 91    |
| 40 | 1992 | 2    | t    | 80    |
| 41 | 1992 | 2    | u    | 70    |
| 42 | 1992 | 2    | v    | 62    |

结果:

| Year | Team | Name | Score |
|------|------|------|-------|
| 1990 | 1    | d    | 98    |
| 1990 | 1    | b    | 94    |
| 1990 | 1    | c    | 93    |
| 1990 | 1    | g    | 79    |
| 1990 | 1    | f    | 78    |
| 1990 | 2    | q    | 99    |
| 1990 | 2    | r    | 85    |
| 1990 | 2    | t    | 82    |
| 1990 | 2    | v    | 80    |
| 1990 | 2    | s    | 69    |
| 1991 | 1    | c    | 95    |
| 1991 | 1    | f    | 93    |
| 1991 | 1    | a    | 88    |
| 1991 | 1    | g    | 81    |
| 1991 | 1    | b    | 73    |
| 1991 | 2    | r    | 99    |
| 1991 | 2    | u    | 93    |
| 1991 | 2    | t    | 89    |
| 1991 | 2    | p    | 86    |
| 1991 | 2    | v    | 80    |
| 1992 | 1    | e    | 90    |
| 1992 | 1    | g    | 88    |
| 1992 | 1    | f    | 84    |
| 1992 | 1    | a    | 80    |
| 1992 | 1    | b    | 77    |
| 1992 | 2    | p    | 94    |
| 1992 | 2    | t    | 89    |
| 1992 | 2    | v    | 86    |
| 1992 | 2    | u    | 77    |
| 1992 | 2    | q    | 74    |

查询:

;
with
sort as
(
    select
        row_number() over (partition by p.Year, p.Team order by p.Score desc) as RowId,
        p.Year,
        p.Team,
        p.Name,
        p.Score
    from 
        @Player as p
)
select
    s.Year,
    s.Team,
    s.Name,
    s.Score
from
    sort as s
where
    s.RowId <= 5

答案 4 :(得分:-1)

你可以查看OVER子句

WITH CTE AS (
SELECT name, ROW_NUMBER() OVER(PARTITION BY season, team ORDER BY performance DESC) AS RN
FROM table
)
SELECT name
FROM CTE
where  RN<=5

类似的东西