SQL Server 2008 - SELECT将多个记录(每个ID)组合到一个记录中

时间:2012-08-29 04:18:18

标签: sql sql-server sql-server-2008

我需要查询学生(STU)&程序(PGM)表并按ID返回一个合并记录,即使每PGM有多个ID条记录也是如此。我考虑过使用GROUP BY STU.ID, STU.FN, STU.LN,但后来我不确定如何在PGM.CD中使用SELECT,因为它不是聚合函数或者是GROUP BY子句。

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

  1. 如果没有PGM条记录,则每个ID只返回一个结果 PGM.CD列返回NULL(或''的{​​{1}}。
  2. 如果CASE表中只有一条记录,PGMPGM.CD = 200'DLA',每个CASE只返回一个结果。
  3. 如果ID表中只有一条记录,PGMPGM.CD <> 200'',每个CASE只返回一个结果。
  4. 如果ID表格中有多条记录(每PGM),即 121,200,156,每ID生成多行。
  5. 我需要一个查询,每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  
    

    我希望所有这一切都有道理。谢谢你的帮助。

    安东尼

3 个答案:

答案 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