T-SQL将两行合并为一行

T-SQL将两行合并为一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我们的目标是让安装地址和调度地址出现在同一行,但我想不出一种方法来做到这一点。我对相同的数据进行了两次查询,并对结果进行了合并。地址详细信息可能不同,但也可能相同(例如安装和发送地址相同) 根据我的假设,可能您的代码太大了,对一些空列使用最大值,并按组删除它们 SELECT zSTRI_CertificateNumber, CPS, MAX(InstallAdr1) InstallAdr1, InstallCity, MAX(DispAdr1)DispAdr1, MAX(Di

我们的目标是让安装地址和调度地址出现在同一行,但我想不出一种方法来做到这一点。我对相同的数据进行了两次查询,并对结果进行了合并。地址详细信息可能不同,但也可能相同(例如安装和发送地址相同)


根据我的假设,可能您的代码太大了,对一些空列使用最大值,并按组删除它们

SELECT 
 zSTRI_CertificateNumber, 
 CPS, 
 MAX(InstallAdr1) InstallAdr1, 
InstallCity, 
MAX(DispAdr1)DispAdr1,
 MAX(DispCity)DispCity, 
DateSubmitted

            FROM (
     SELECT zSTRI_CertificateNumber,
                'STRI' + CAST(op.ID as Varchar(4)) as CPSref,
                JobRef,
                CAST(CASE
                    WHEN notif.Cps = 1 THEN 'CPS'
                    END AS varchar(3)) as CPS,
                notif.DateSubmitted,
                nAdr.AddressLine1 as InstallAdr1,
                nAdr.AddressLine2 as InstallAdr2,
                nAdr.City as InstallCity,
                nAdr.PostCode as InstallPostCode,
                '' as DispAdr1,
                '' as DispAdr2,
                '' as DispCity,
                '' as DispPostCode,

                DateWorkCompleted,
                c.CompanyName,
                msrs.UniqueID

        FROM [Notification] notif 
            INNER JOIN NotificationAddress nAdr
                ON notif.ID = nAdr.NotificationID
            INNER JOIN Company c
                ON c.CompanyID = notif.CompanyID
            INNER JOIN NotificationMeasures msrs
                ON notif.ID = msrs.NotificationID
            INNER JOIN Operative op
                ON op.ID = NotifyingOperativeID
        WHERE  notif.DispatchMethodEmail = 0
                AND nAdr.InstallAddress = 1
                 AND notif.ID = 5411
            UNION ALL


        SELECT zSTRI_CertificateNumber,
                'STRI' + CAST(op.ID as Varchar(4)) as CPSref,
                JobRef,
                CAST(CASE
                    WHEN notif.Cps = 1 THEN 'CPS'
                    END AS varchar(3)) as CPS,
                notif.DateSubmitted,
                '' as InstallAdr1,
                '' as InstallAdr2,
                '' as InstallCity,
                '' as InstallPostCode,

                nAdr.AddressLine1 as DispAdr1,
                nAdr.AddressLine2 as DispAdr2,
                nAdr.City as DispCity,
                nAdr.PostCode as DispPostCode,
                DateWorkCompleted,
                c.CompanyName,
                msrs.UniqueID

        FROM [Notification] notif 
            INNER JOIN NotificationAddress nAdr
                ON notif.ID = nAdr.NotificationID
            INNER JOIN Company c
                ON c.CompanyID = notif.CompanyID
            INNER JOIN NotificationMeasures msrs
                ON notif.ID = msrs.NotificationID
            INNER JOIN Operative op
                ON op.ID = NotifyingOperativeID
        WHERE
                notif.DispatchMethodEmail = 0
                AND nAdr.DispatchAddress = 1 
                AND notif.ID = 5411

            )As Subgroup
            GROUP BY zSTRI_CertificateNumber, CPS, InstallCity, DateSubmitted

听起来您只需要在一个查询中使用不同的连接条件在同一个NotificationAddress表上连接两次

e、 g


以下是完成此任务的查询的摘要版本(基于已接受的答案)


我使用了你的建议,只是集中在问题表(地址)上,非常感谢。这很好,但不能将数据汇总成一行。
SELECT 
 zSTRI_CertificateNumber, 
 CPS, 
 MAX(InstallAdr1) InstallAdr1, 
InstallCity, 
MAX(DispAdr1)DispAdr1,
 MAX(DispCity)DispCity, 
DateSubmitted

            FROM (
     SELECT zSTRI_CertificateNumber,
                'STRI' + CAST(op.ID as Varchar(4)) as CPSref,
                JobRef,
                CAST(CASE
                    WHEN notif.Cps = 1 THEN 'CPS'
                    END AS varchar(3)) as CPS,
                notif.DateSubmitted,
                nAdr.AddressLine1 as InstallAdr1,
                nAdr.AddressLine2 as InstallAdr2,
                nAdr.City as InstallCity,
                nAdr.PostCode as InstallPostCode,
                '' as DispAdr1,
                '' as DispAdr2,
                '' as DispCity,
                '' as DispPostCode,

                DateWorkCompleted,
                c.CompanyName,
                msrs.UniqueID

        FROM [Notification] notif 
            INNER JOIN NotificationAddress nAdr
                ON notif.ID = nAdr.NotificationID
            INNER JOIN Company c
                ON c.CompanyID = notif.CompanyID
            INNER JOIN NotificationMeasures msrs
                ON notif.ID = msrs.NotificationID
            INNER JOIN Operative op
                ON op.ID = NotifyingOperativeID
        WHERE  notif.DispatchMethodEmail = 0
                AND nAdr.InstallAddress = 1
                 AND notif.ID = 5411
            UNION ALL


        SELECT zSTRI_CertificateNumber,
                'STRI' + CAST(op.ID as Varchar(4)) as CPSref,
                JobRef,
                CAST(CASE
                    WHEN notif.Cps = 1 THEN 'CPS'
                    END AS varchar(3)) as CPS,
                notif.DateSubmitted,
                '' as InstallAdr1,
                '' as InstallAdr2,
                '' as InstallCity,
                '' as InstallPostCode,

                nAdr.AddressLine1 as DispAdr1,
                nAdr.AddressLine2 as DispAdr2,
                nAdr.City as DispCity,
                nAdr.PostCode as DispPostCode,
                DateWorkCompleted,
                c.CompanyName,
                msrs.UniqueID

        FROM [Notification] notif 
            INNER JOIN NotificationAddress nAdr
                ON notif.ID = nAdr.NotificationID
            INNER JOIN Company c
                ON c.CompanyID = notif.CompanyID
            INNER JOIN NotificationMeasures msrs
                ON notif.ID = msrs.NotificationID
            INNER JOIN Operative op
                ON op.ID = NotifyingOperativeID
        WHERE
                notif.DispatchMethodEmail = 0
                AND nAdr.DispatchAddress = 1 
                AND notif.ID = 5411

            )As Subgroup
            GROUP BY zSTRI_CertificateNumber, CPS, InstallCity, DateSubmitted
select A.id, X.value as 'xValue', Y.value as 'yValue'
from IdTable A
inner join ValueTable X
    on A.id=X.id
inner join ValueTable Y      -- same table as "X"
    on A.id=Y.id
where X.type = 'X'
and   Y.type = 'Y'           -- but different join criteria
Select NotifId, MAX(InstallAddress1) InstallAddress1, 
        MAX(InstallAddress2) InstallAddress2,
        MAX(InstallCity) InstallCity,
        MAX(InstallPostCode) InstallPostCode,
        MAX(DispatchAddress1) DispatchAddress1,
        MAX(DispatchAddress2) DispatchAddress2,
        MAX(DispatchCity) DispatchCity,
        MAX(DispatchPostCode) DispatchPostCode
    FROM (
        select  X.NotificationID as NotifId,
            X.AddressLine1 as 'InstallAddress1',
            X.AddressLine2 as 'InstallAddress2',
            X.City as 'InstallCity',
            X.Postcode as 'InstallPostCode',
            null as 'DispatchAddress1',
            null as 'DispatchAddress2',
            null as 'DispatchCity',
            null as 'DispatchPostCode'
        from NotificationAddress X
        Where X.InstallAddress = 1

        UNION
        Select Y.NotificationID as NotifId,
            null as 'InstallAddress1',
            null as 'InstallAddress2',
            null as 'InstallCity',
            null as 'InstallPostCode',
            Y.AddressLine1 as 'DispatchAddress1',
            Y.AddressLine2 as 'DispatchAddress2',
            Y.City as 'DispatchCity',
            Y.Postcode as 'DispatchPostCode'
            from NotificationAddress Y
        where   Y.DispatchAddress = 1
 ) as b
    GROUP BY  NotifId