我需要查询学生(STU
)&程序(PGM
)表和每ID
返回一个联合的纪录,即使有多个PGM
记录每ID
。我想过使用GROUP BY STU.ID, STU.FN, STU.LN
,但当时我不知道如何在SELECT
使用PGM.CD
,因为它不是由clause.`SQL Server 2008中 - 选择(每个ID)的多个记录合并到一个记录
的PGM
表可能有也可能没有记录的聚合函数或GROUP。我下面的查询返回这些可能的结果:
- 如果没有
PGM
记录,每ID
只有一个结果被返回和 的PGM.CD
列返回NULL
(占CASE
''
)。 - 如果只有一个在
PGM
表记录,并PGM.CD = 200
('DLA'
每CASE
),然后每ID
只有一个结果返回。 - 如果只有一个在
PGM
表记录,并PGM.CD <> 200
(''
每CASE
),然后每ID
只有一个结果返回。 - 如果在
PGM
表多于一个的记录(每ID
),即 121,200,156,这每ID
产生多个行。
我需要一个查询,每ID
只返回一行,结合PGM.CD
列的结果。该PGM.CD
栏应该只返回''
或200
('DLA'
每CASE
)
SELECT STU.ID, STU.FN, STU.LN,
CASE PGM.CD
WHEN '200' THEN 'DLA'
ELSE ''
END
FROM STU
LEFT JOIN PGM
ON STU.ID = PGM.PID
这是我的查询将返回(没有的CASE
修改PGM.CD
):
STU.ID STU.FN STU.LN PGM.CD
1000 Bruce Wayne NULL
1001 Clark Kent 200
1002 Barry Allen 151
1002 Barry Allen 101
1003 Hal Jordan 126
1003 Hal Jordan 200
1003 Hal Jordan 101
这是我的查询退货(WithCASE
修改PGM.CD
):
STU.ID STU.FN STU.LN PGM.CD
1000 Bruce Wayne
1001 Clark Kent DLA
1002 Barry Allen
1002 Barry Allen
1003 Hal Jordan
1003 Hal Jordan DLA
1003 Hal Jordan
我需要它返回此:
STU.ID STU.FN STU.LN PGM.CD
1000 Bruce Wayne
1001 Clark Kent DLA
1002 Barry Allen
1003 Hal Jordan DLA
我希望这一切才有意义。谢谢您的帮助。
安东尼
谢谢。我不得不将它改为'LEFT JOIN',因为它没有返回'STU'表中的每个记录(并非所有的学生都在Programs表中有记录),但是一旦我这样做了,它就完美地工作了。感谢有关SQL小提琴(!)的信息。我不知道那件事。 –
本网站有人向我展示了这一点,它非常有用:)我很高兴它可以帮助你! –
András,如果你有时间看下我对Mehdi的评论,你能解释为什么使用'WITH AS'(带有'MAX CASE')给出了正确的结果,而不是直接使用'MAX CASE' 'SELECT'? –