如何在SQL Server中组合不同的行?

时间:2014-12-16 11:14:25

标签: sql sql-server select group-by left-join

查询:

select 
    ag.AGENTID as AGENTID, ag.AGENTNAME as AGENTNAME,
    case when pc.CONTACTTYPECD='M' then pc.CONTACTNUM end as 'MOBILE',
    case when pc.CONTACTTYPECD='R' then pc.CONTACTNUM end as 'RESIDENCE',
    case when pc.CONTACTTYPECD='EM' then pc.CONTACTNUM end as 'EMERGENCY_NO'
from 
    AGENT ag 
left join 
    PARTY p on p.PARTYID = ag.PARTYID
left join  
    PARTYCONTACT pc on pc.PARTYSEQ = p.PARTYSEQ
where 
    ag.AGENTID = '10000005'

输出

enter image description here

预期输出
enter image description here

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT ag.AGENTID AS AGENTID, ag.AGENTNAME AS AGENTNAME,
       MAX(CASE WHEN pc.CONTACTTYPECD='M' THEN pc.CONTACTNUM END) AS 'MOBILE',
       MAX(CASE WHEN pc.CONTACTTYPECD='R' THEN pc.CONTACTNUM END) AS 'RESIDENCE',
       MAX(CASE WHEN pc.CONTACTTYPECD='EM' THEN pc.CONTACTNUM END) AS 'EMERGENCY_NO'
FROM AGENT ag 
LEFT JOIN PARTY p ON p.PARTYID = ag.PARTYID
LEFT JOIN PARTYCONTACT pc ON pc.PARTYSEQ = p.PARTYSEQ
WHERE ag.AGENTID = '10000005'
GROUP BY ag.AGENTID, ag.AGENTNAME

答案 1 :(得分:1)

或单独加入每种类型的联系人......

  SELECT ag.AGENTID AS AGENTID, ag.AGENTNAME AS AGENTNAME,
           MobileContact.CONTACTNUM AS 'MOBILE',
           ResidenceContact.CONTACTNUM AS 'RESIDENCE',
           EmergencyContact.CONTACTNUM AS 'EMERGENCY_NO'
    FROM AGENT ag 

    LEFT JOIN PARTY p ON p.PARTYID = ag.PARTYID

    LEFT JOIN PARTYCONTACT as MobileContact 
    ON MobileContact.PARTYSEQ = p.PARTYSEQ
    AND MobileContact.CONTACTTYPECD='M'

    LEFT JOIN PARTYCONTACT as ResidenceContact 
    ON ResidenceContact.PARTYSEQ = p.PARTYSEQ
    AND ResidenceContact.CONTACTTYPECD='R'

    LEFT JOIN PARTYCONTACT as EmergencyContact 
    ON EmergencyContact.PARTYSEQ = p.PARTYSEQ
    AND EmergencyContact.CONTACTTYPECD='EM'

    WHERE ag.AGENTID = '10000005'