SQL Server 2008-选择此选项可将多个记录(每个ID)合并到一个记录中
我需要查询学生(SQL Server 2008-选择此选项可将多个记录(每个ID)合并到一个记录中,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我需要查询学生(STU)和程序(PGM)表,并为每个ID返回一个组合记录,即使每个ID有多个PGM记录。我曾考虑过使用groupby STU.ID、STU.FN、STU.LN,但后来我不确定如何在SELECT中使用PGM.CD,因为它不是聚合函数或GROUPBY子句 PGM表可能有记录,也可能没有记录。下面的查询返回以下可能的结果: 如果没有PGM记录,则每个ID只返回一个结果并 PGM.CD列返回NULL(或'每个案例都返回NULL) 如果PGM表中只有一条记录,并且PGM.CD=200 ('
STU
)和程序(PGM
)表,并为每个ID
返回一个组合记录,即使每个ID
有多个PGM
记录。我曾考虑过使用groupby STU.ID、STU.FN、STU.LN
,但后来我不确定如何在SELECT
中使用PGM.CD
,因为它不是聚合函数或GROUPBY子句
PGM
表可能有记录,也可能没有记录。下面的查询返回以下可能的结果:
PGM
记录,则每个ID
只返回一个结果并
PGM.CD
列返回NULL
(或'
每个案例都返回NULL
)
PGM
表中只有一条记录,并且PGM.CD=200
('DLA'
每个案例
),则每个ID
只返回一个结果李>
PGM
表中只有一条记录,并且PGM.CD 200
('
每个案例
),则每个ID
只返回一个结果PGM
表中有多条记录(根据ID
),即。
121200156,这将为每个ID
生成多行ID
只返回一行,并结合PGM.CD
列的结果。PGM.CD
列应仅返回'
或200
('DLA'
每个案例)
这就是我的查询返回的内容(不带案例修改PGM.CD
):
这就是我的查询返回的内容(使用案例修改PGM.CD
):
我需要它来归还这个:
STU.ID STU.FN STU.LN PGM.CD
1000 Bruce Wayne
1001 Clark Kent DLA
1002 Barry Allen
1003 Hal Jordan DLA
我希望所有这些都有意义。谢谢你的帮助
Anthony您应该使用以下简单查询:
WITH CTE_PGM
AS
(
SELECT PGM.PID, MAX( CASE PGM.CD
WHEN '200' THEN 'DLA'
ELSE ''
END) AS MaxCD
FROM PGM
GROUP BY PGM.PID
)
SELECT STU.ID, STU.FN, STU.LN, MaxCD
FROM STU
INNER JOIN CTE_PGM ON STU.ID = CTE_PGM.PID
试着使用SQLFiddle(!)它对快速回答有很大帮助
我问了一个问题,它是如何工作的。请检查。使用以下查询:
SELECT STU.ID, STU.FN, STU.LN, ISNULL(Max( Case When PGM.CD = 200 then 'DLA' Else '' End), '') as PGM_CD
FROM STU
Left JOIN PGM ON STU.ID = PGM.PID
Group by STU.ID, STU.FN, STU.LN
非常感谢。我不得不将其更改为左连接
,因为它没有返回STU
表中的所有记录(并非所有学生都有Programs表中的记录),但一旦我这样做了,它就工作得很好。感谢您提供有关SQLFiddle(!)的信息。我不知道。这个网站的某个人也向我展示了这一点,它非常有用:)我很高兴它能帮助你!András,如果你有时间看看我在下面对Mehdi的评论,你能解释一下为什么将与AS
(与MAX CASE
)一起使用会得到正确的结果,而不是直接在SELECT
中使用MAX CASE
?Mehid查询返回的结果与我的相同。那里不存在重复记录,但可能您没有将他的查询更改为作为我的左连接,因此这可能是原因。感谢您的帮助。我发现了为什么我会得到不同的结果。我将所有查询设置为使用LEFT JOIN
,但Andras的查询没有使用groupby
子句。当我开始查看所有结果(4505)时,我发现了重复的结果。一旦我按STU.ID、STU.FN、STU.LN添加了组,所有查询都给出了相同的结果(3919)。谢谢大家,谢谢。您的查询返回的结果比上面的Andras少,当我将这两个结果与STU的SELECT COUNT(*)进行比较时,Andras的查询是正确的。我对AS
和MAX
的了解不多,不知道为什么会这样,但这会给我一些其他的研究/学习。再次感谢。请检查Andras的查询结果。若我的查询结果和Andras的查询结果不同;这意味着在Andras查询结果中,有些学生存在重复记录。Anthony写道,他在使用时将我的内部连接更改为左连接,所以我认为这可能是不同之处。因为基本上两个查询的结果完全相同,没有重复的可能。谢谢。我在询问中犯了错误。我必须在查询中使用左连接而不是内部连接。请看我的编辑。@mehdilotfi谢谢大家的帮助。我发现了为什么我会得到不同的结果。我将所有查询设置为使用LEFT JOIN
,但Andras的查询没有使用groupby
子句。当我开始查看所有结果(4505)时,我发现了重复的结果。一旦我按STU.ID、STU.FN、STU.LN添加了组,所有查询都给出了相同的结果(3919)。谢谢大家,谢谢。您的查询返回的结果比上面的Andras少,当我将这两个结果与STU的SELECT COUNT(*)进行比较时,Andras的查询是正确的。我对AS
和MAX
的了解不多,不知道为什么会这样,但这会给我一些其他的研究/学习。再次感谢。
STU.ID STU.FN STU.LN PGM.CD
1000 Bruce Wayne
1001 Clark Kent DLA
1002 Barry Allen
1003 Hal Jordan DLA
WITH CTE_PGM
AS
(
SELECT PGM.PID, MAX( CASE PGM.CD
WHEN '200' THEN 'DLA'
ELSE ''
END) AS MaxCD
FROM PGM
GROUP BY PGM.PID
)
SELECT STU.ID, STU.FN, STU.LN, MaxCD
FROM STU
INNER JOIN CTE_PGM ON STU.ID = CTE_PGM.PID
SELECT STU.ID, STU.FN, STU.LN, ISNULL(Max( Case When PGM.CD = 200 then 'DLA' Else '' End), '') as PGM_CD
FROM STU
Left JOIN PGM ON STU.ID = PGM.PID
Group by STU.ID, STU.FN, STU.LN
SELECT STU.ID, STU.FN, STU.LN,
max(CASE PGM.CD
WHEN '200' THEN 'DLA'
ELSE '')
END
FROM STU
LEFT JOIN PGM
ON STU.ID = PGM.PID
group by STU.ID, STU.FN, STU.LN