2012-08-29 50 views
1

我需要查询学生(STU)&程序(PGM)表和每ID返回一个联合的纪录,即使有多个PGM记录每ID。我想过使用GROUP BY STU.ID, STU.FN, STU.LN,但当时我不知道如何在SELECT使用PGM.CD,因为它不是由clause.`SQL Server 2008中 - 选择(每个ID)的多个记录合并到一个记录

PGM表可能有也可能没有记录的聚合函数或GROUP。我下面的查询返回这些可能的结果:

  1. 如果没有PGM记录,每ID只有一个结果被返回和 的PGM.CD列返回NULL(占CASE'')。
  2. 如果只有一个在PGM表记录,并PGM.CD = 200'DLA'CASE),然后每ID只有一个结果返回。
  3. 如果只有一个在PGM表记录,并PGM.CD <> 200''CASE),然后每ID只有一个结果返回。
  4. 如果在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 

我希望这一切才有意义。谢谢您的帮助。

安东尼

回答

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小提琴它是在一个快速回答一个很大的帮助。

我发了一个Example for you它是如何工作的。请检查一下。

+0

谢谢。我不得不将它改为'LEFT JOIN',因为它没有返回'STU'表中的每个记录(并非所有的学生都在Programs表中有记录),但是一旦我这样做了,它就完美地工作了。感谢有关SQL小提琴(!)的信息。我不知道那件事。 –

+0

本网站有人向我展示了这一点,它非常有用:)我很高兴它可以帮助你! –

+0

András,如果你有时间看下我对Mehdi的评论,你能解释为什么使用'WITH AS'(带有'MAX CASE')给出了正确的结果,而不是直接使用'MAX CASE' 'SELECT'? –

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 
+0

谢谢。你的查询返回的结果比上面的Andras'少,当我将两个结果与'SELECT COUNT(*)FROM STU'进行比较时,Andras的查询是正确的。我不太了解'WITH AS'和'MAX'知道为什么会是这种情况,但它会给我另外一些研究/学习。再次感谢。 –

+0

请检查Andras的查询结果。如果我的查询结果不符合Andras查询的结果;意味着在Andras查询结果中存在一些学生的重复记录。 –

+0

安东尼写道,当他使用它时,他将我的INNER JOIN改为LEFT JOIN,所以我认为这可能是不同的。因为基本上这两个查询具有完全相同的结果而没有重复的可能性。 –

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 
+0

谢谢。你的查询返回的结果比上面的Andras'少,当我将两个结果与'SELECT COUNT(*)FROM STU'进行比较时,Andras的查询是正确的。我不太了解'WITH AS'和'MAX'知道为什么会是这种情况,但它会给我另外一些研究/学习。再次感谢。 –

+0

这里你需要STU表的所有记录吗? – AnandPhadke

相关问题