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