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