2017-11-23 6 views
1

私は2つのテーブルInvoiceLocationsPCInvoiceLocationそれぞれのデータを持っています。カンマ区切りフィールドに基づく内部結合

enter image description here

私は、次のような出力をしたいです。

enter image description here

助けてください。コメントから

コード:

declare @@LocationId nvarchar(50)='1,2' 
declare @@sql nvarchar(Max) 
Declare @@Output table(Code nvarchar(10) not null) 
Set @@sql='SELECT Code FROM invoiceLocations WHERE Id IN ('[email protected]+')' 
insert @@Output(Code) 
exec sp_executesql @sql 
+0

あなた自身で試しましたか? – SchmitzIT

+0

はい次のクエリを実行しようとしていますが、私のために働いていません –

+0

declare @@ LocationId nvarchar(50)= '1,2' @@ sql nvarchar(最大) を宣言する@@出力テーブル(コードnvarchar(10) null) @@ sql = 'を設定します。invoiceLocations WHERE Id IN(' + @ LocationId + ')'insert @@ Output(Code)exec sp_executesql @sql –

答えて

2

テスト環境

の作成は、まずiは

CREATE TABLE InvoiceLocations (ID int,CODE varchar(3), VALUE varchar(3)); 
CREATE TABLE PCInvoiceLOcation (ID int,CategoryID INT, Locations varchar(50),DefaultLocationID int); 


INSERT INTO InvoiceLocations(ID,CODE,VALUE) 
VALUES(1,'BFC','BFC'), 
(2,'BRH','BRH'), 
(3,'BRP','BRP'), 
(4,'BCC','BCC') 

INSERT INTO PCInvoiceLOcation(ID,CategoryID,Locations,DefaultLocationID) 
VALUES(1,1,'1,2',1), 
(2,2,'2,3',2), 
(3,3,'2,1',1), 
(4,4,'4',4) 

ソリューション

あなたが達成できるテスト環境を作成するには、次のコマンドを使用しましたこの 3つのステップで:

  1. まず、行
  2. Locationsフィールドを分割関連の値
  3. はカンマでまず

を提出区切りに結果を集計得るためにInvoiceLocations表で、これらの行に参加Locationsフィールドを行に分割します。

;with tmp(ID,CategoryID,Locations,DefaultLocationID, DataItem , Data) as (
     select ID,CategoryID,Locations,DefaultLocationID, 
       CAST(LEFT(Locations, CHARINDEX(',',Locations+',')-1) as varchar(5)), 
       STUFF(Locations, 1, CHARINDEX(',',Locations+','), '') 
     from PCInvoiceLOcation 
    union all 
     select ID,CategoryID,Locations,DefaultLocationID, 
       CAST(LEFT(Data, CHARINDEX(',',Data+',')-1) AS Varchar(5)), 
       STUFF(Data, 1, CHARINDEX(',',Data+','), '') 
     from tmp 
     where Data > '') 

コンマにクエリ全体が

のように見えます

Select ID,CategoryID,Locations,DefaultLocationID, 
      STUFF((SELECT ', ' + VALUE 
         FROM Tmp2 AS T3 
         WHERE T3.ID = tmp2.ID 
         FOR XML PATH('')), 1, 2, '') 
    FROM tmp2 
    GROUP BY ID,CategoryID,Locations,DefaultLocationID 

をします提出区切りに関連する値

select tmp.ID,CategoryID,Locations,DefaultLocationID, DataItem , InvoiceLocations.VALUE 
from tmp 
INNER JOIN InvoiceLocations ON tmp.DataItem = InvoiceLocations.ID 

は結果を集計得るためにInvoiceLocationsテーブルでこれらの行に参加

;with tmp(ID,CategoryID,Locations,DefaultLocationID, DataItem , Data) as ( select ID,CategoryID,Locations,DefaultLocationID, CAST(LEFT(Locations, CHARINDEX(',',Locations+',')-1) as varchar(5)), STUFF(Locations, 1, CHARINDEX(',',Locations+','), '') from PCInvoiceLOcation union all select ID,CategoryID,Locations,DefaultLocationID, CAST(LEFT(Data, CHARINDEX(',',Data+',')-1) AS Varchar(5)), STUFF(Data, 1, CHARINDEX(',',Data+','), '') from tmp where Data > '') ,tmp2(ID,CategoryID,Locations,DefaultLocationID, DataItem , VALUE) AS ( select tmp.ID,CategoryID,Locations,DefaultLocationID, DataItem , InvoiceLocations.VALUE from tmp INNER JOIN InvoiceLocations ON tmp.DataItem = InvoiceLocations.ID) Select ID,CategoryID,Locations,DefaultLocationID, STUFF((SELECT ', ' + VALUE FROM Tmp2 AS T3 WHERE T3.ID = tmp2.ID FOR XML PATH('')), 1, 2, '') FROM tmp2 GROUP BY ID,CategoryID,Locations,DefaultLocationID 

結果:

enter image description here

SQLFiddle Demo

参照

関連する問題