2016-08-17 1 views
0

私は、後続のサンプルデータを作成しました。私は、私は2つの一時テーブルを作成し、別の2を挿入することを計画していた以下の enter image description hereマスタレコードを使用して異なるタイプのデータを単一の行に問い合わせる

のように1つの行

すなわちとしての私の情報を取得するには、上記の表を照会する必要が

enter image description here enter image description here 別々のアドレスの種類。次に、社内のメインテーブルに内部を結合します。私は確信していません、これは良い解決策です。誰かが私の問題に自分の考えやコードを分かち合っているかどうかは分かりません。

答えて

2

をフィールドリストを指定する必要があり、これを試してみてください。..

Select companyId,CompanyName,homesddress1 
    ,homeaddress2,HomePostCode,OfficeAddress1,OfficeAddress2,OfficePostCode 
    From tblCompany a 
    Outer apply (select address1 homesddress1, address2 homeaddress2,postcode HomePostCode 
          From tblAddress t 
          Where AddressType='home' and t.companyid=a.companyid) 
    Outer apply (select address1 OfficeAddress1, address2 Officeaddress2,postcode OfficePostCode 
          From tblAddress t2 
          Where AddressType='Office ' and t2.companyid=a.companyid) 
2

2つの外部結合を使用して簡単な選択で行うことができます。一部の企業では1つのアドレスしか持てないため、結合する必要があることに注意してください。

DECLARE @company TABLE (
CompanyId int, 
CompanyName varchar(50) 
) 

DECLARE @companyAddress TABLE (
Id int, 
AddressType varchar(10), 
Address1 varchar(50), 
Address2 varchar(50), 
Postcode varchar(10), 
CompanyId int 
) 

INSERT INTO @company VALUES (1, 'Test Company') 

INSERT INTO @companyAddress VALUES (1, 'Home', '25 Street', 'City 1', 'BA3 1PE', 1) 
INSERT INTO @companyAddress VALUES (2, 'Office', '25 Street', 'City 2', 'NA1 4TW', 1) 

SELECT c.CompanyId, c.CompanyName, 
h.Address1 AS HomeAddress1, h.Address2 AS HomeAddress2, h.Postcode AS HomePostcode, 
o.Address1 AS OfficeAddress1, o.Address2 AS OfficeAddress2, o.Postcode AS OfficePostcode 
FROM @company c 
LEFT JOIN 
@companyAddress h ON h.CompanyId = c.CompanyId AND h.AddressType = 'Home' 
LEFT JOIN 
@companyAddress o ON o.CompanyId = c.CompanyId AND o.AddressType = 'Office' 
+0

私はあなたの例では、内部を示していると思います結合が外部結合である必要があると言ったときの結合(デフォルト)... – Zack

+0

LEFT JOINはOUTER JOINです –

0

ここではほぼダイナミックなバージョンです。あなただけの

Declare @YourTable table (ID int,AddressType varchar(25),Address1 varchar(50),Address2 varchar(50),CompanyID int) 
Insert Into @YourTable values 
(1,'Home' ,'25 Street','City 1',1), 
(2,'Office','10 Avenue','City 2',1) 

Declare @XML xml = (Select * from @YourTable for XML RAW)    --<<< Initial Query 
;with cteBase as (
    Select ID   = R.value('@CompanyID','int')      --<<< Key ID 
      ,AddressType = R.value('@AddressType','varchar(50)') 
      ,Item  = R.value('@AddressType','varchar(50)')+Attr.value('local-name(.)','varchar(100)') 
      ,Value  = Attr.value('.','varchar(max)') 
    From @XML.nodes('/row') as A(R) 
    Cross Apply A.r.nodes('./@*[local-name(.)!="CompanyID"]') as B(Attr) --<<< Key ID 
),cteDist as (Select Distinct ID,Item from cteBase 
),cteComp as (
     Select A.*,B.Value 
     From cteDist A 
     Cross Apply (Select Value=Stuff((Select Distinct ',' + Value 
         From cteBase 
         Where ID=A.ID 
         and Item=A.Item 
         For XML Path ('')),1,1,'')) B 
) 
Select * 
From (Select * From cteComp) as s 
Pivot (max(value) 
For Item in (HomeID,HomeAddressType,HomeAddress1,HomeAddress2,OfficeID,OfficeAddressType,OfficeAddress1,OfficeAddress2)) as pvt 

戻り

に、最終的なピボットで
ID HomeID HomeAddressType HomeAddress1 HomeAddress2 OfficeID OfficeAddressType OfficeAddress1 OfficeAddress2 
1 1  Home   25 Street  City 1   2   Office    10 Avenue  City 2 
関連する問題