これを行う方法は、UNPIVOTを使用することです。解決策は次のとおりです。
With AddrTable as (
Select AddrFld, MailAddr From (
Select Cast(ISNULL([Line1], '') as Varchar(102)) as [A1],
Cast(ISNULL([Line2], '') as Varchar(102)) as [A2],
Cast(ISNULL([Line3], '') as Varchar(102)) as [A3],
Cast(ISNULL(LTRIM(RTRIM(City)),'') + ' ' + ISNULL(LTRIM(RTRIM(RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(PostalCode)),'') as Varchar(102)) as A4
From TableName Where [email protected]) p
Unpivot (MailAddr For AddrFld in ([A1], [A2], [A3], [A4])) as unpvt)
Select Row_Number() over (Order by (Case Len(MailAddr) When 0 then 1 else 0 end), AddrFld) as RN,
MailAddr From AddrTable
Order By RN
出力は次のとおりです:
Address1
Westby WI 55555
-empty line-
-empty line-
City / Region / Postalは合計で最大102文字を使用できるため、フィールドの長さとして「Varchar(102)」を使用する必要があることに注意してください(ピボット解除ではすべてのフィールドが同じである必要があります)。また、「@ UniqueID」は、アドレスが必要なレコードの識別子であることに注意してください。これにより、常に4つの行が返されます。 住所に必要なデータが含まれています。
更新: これを4つの列のセットとして返す必要がある場合 4行ではなく、ビューに配置してから、ピボットを使用してビューにクエリを実行します。 。ビューを作成するときに上記を少し変更する必要があったため、ここにビューを含めました。uniqueIDフィールドが含まれ、並べ替えは行われませんでした(並べ替えはクエリで行われます):
Create View AddressRows AS
With AddrTable as (
Select UniqueID, AddrFld, MailAddr From (
Select UniqueID,
Cast(ISNULL([Line1], '') as Varchar(102)) as [A1],
Cast(ISNULL([Line2], '') as Varchar(102)) as [A2],
Cast(ISNULL([Line3], '') as Varchar(102)) as [A3],
Cast(ISNULL(LTRIM(RTRIM(City)),'') + ' ' + ISNULL(LTRIM(RTRIM(RegionCode)),'') + ' ' + ISNULL(LTRIM(RTRIM(PostalCode)),'') as Varchar(102)) as A4
From TableName Where [email protected]) p
Unpivot (MailAddr For AddrFld in ([A1], [A2], [A3], [A4])) as unpvt)
Select UniqueID,
Row_Number() over (Order by (Case Len(MailAddr) When 0 then 1 else 0 end), AddrFld) as RN,
MailAddr From AddrTable
次に、一致する「行」を引き出したい場合は、このSQLを使用してピボットバックします(UniqueIDを使用して再度クエリを実行していることに注意してください):
Select [Addr1], [Addr2], [Addr3], [Addr4] From (
Select Top 4 'Addr' + Cast(Row_Number() over (Order by RN) as Varchar(12)) as AddrCol, -- "Top 4" needed so we can sneak the "Order By" in
MailAddr
From AddressRows Where [email protected]
) p PIVOT (Max([MailAddr]) for AddrCol in ([Addr1], [Addr2], [Addr3], [Addr4])
) as pvt
これは次を返します:
Addr1 Addr2 Addr3 Addr4
-------------- ------------------ ------------- ------------------
Address1 Westby WI 54667