我需要查询学生(STU
)&程序(PGM
)表并按ID
返回一个合并记录,即使每PGM
有多个ID
条记录也是如此。我考虑过使用GROUP BY STU.ID, STU.FN, STU.LN
,但后来我不确定如何在PGM.CD
中使用SELECT
,因为它不是聚合函数或者是GROUP BY子句。
PGM
表可能有也可能没有记录。我的查询返回以下可能的结果:
PGM
条记录,则每个ID
只返回一个结果
PGM.CD
列返回NULL
(或''
的{{1}}。CASE
表中只有一条记录,PGM
(PGM.CD = 200
)'DLA'
,每个CASE
只返回一个结果。 ID
表中只有一条记录,PGM
(PGM.CD <> 200
)''
,每个CASE
只返回一个结果。ID
表格中有多条记录(每PGM
),即
121,200,156,每ID
生成多行。我需要一个查询,每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
修改CASE
):
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
我希望所有这一切都有道理。谢谢你的帮助。
安东尼
答案 0 :(得分:2)
您应该使用这样的简单查询:
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
尝试使用SQL Fiddle(!),这对快速回答是一个很大的帮助。
我做了Example for you它是如何工作的。请检查一下。
答案 1 :(得分:0)
使用以下查询:
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
答案 2 :(得分:0)
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