1

我需要查询 Student( STU) 和 Programs( PGM) 表并返回一个组合记录ID,即使每个有多个PGM记录ID。我考虑过使用GROUP BY STU.ID, STU.FN, STU.LN,但后来我不确定如何在 中使用PGM.CDSELECT因为它不是聚合函数或在 GROUP BY 子句中。

PGM表可能有也可能没有记录。我下面的查询返回这些可能的结果:

  1. 如果没有PGM记录,则仅ID返回一个结果 per 并且该PGM.CD列返回NULL(或''per CASE)。
  2. 如果表中只有一条记录PGM,并且PGM.CD = 200 ( 'DLA'per the CASE),则 perID仅返回一个结果。
  3. 如果表中只有一条记录PGM,并且PGM.CD <> 200 ( ''per the CASE),则 perID仅返回一个结果。
  4. 如果表中有多个记录PGM(per 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

这是我的查询返回的内容(带有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  

我需要它来返回这个:

STU.ID  STU.FN  STU.LN  PGM.CD
1000    Bruce   Wayne   
1001    Clark   Kent    DLA
1002    Barry   Allen   
1003    Hal     Jordan  DLA

我希望所有这些都是有道理的。谢谢您的帮助。

安东尼

4

3 回答 3

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(!) 它对快速回答有很大帮助。

为你做了一个例子,它是如何工作的。请检查一下。

于 2012-08-29T04:33:01.893 回答
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 
于 2012-08-29T05:09:53.067 回答
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
于 2012-08-29T05:14:15.590 回答