sql >> データベース >  >> RDS >> Sqlserver

この郵送先住所SQLServerSELECTステートメントを改善するにはどうすればよいですか?

    これを行う方法は、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                                                 
    


    1. Sqlalchemyは古い行を返しますか?

    2. 1行目のエラー2006(HY000):MySQLサーバーがなくなりました

    3. 列内の個別の値の数を取得するにはどうすればよいですか?

    4. MySQL + Rails:errno:150外部キー制約が正しく形成されていません