2016-11-15 55 views
0

以下是表格和請求列表;如何進行查詢以列出交叉匹配圖表

表A

ID Description Code 
1 Desc1  CodeA 
2 Desc2  CodeB 
3 Desc3  CodeC 
4 Desc4  CodeD 
5 Desc5  CodeE 

表B(代碼之間關係的匹配,包括它們-自我)

ID TableA_ID TableA_ID_Relation 
1  1    1 
2  1    2 
3  2    1 
4  2    2 
5  2    3 
6  2    4 
7  3    2 
8  3    3 
9  4    1 
10 4    3 
11 4    4 
12 5    1 
13 5    2 
14 5    3 
15 5    4 
16 5    5 

請求列表輸出的表A和B上述(關係應顯示在BIT類型中)

ID Description   CodeA CodeB CodeC CodeD CodeE 
1 Desc1  CodeA 1  1  0  0  0 
2 Desc2  CodeB 1  1  1  1  0 
3 Desc3  CodeC 0  1  1  0  0 
4 Desc4  CodeD 1  0  1  1  0 
5 Desc5  CodeE 1  1  1  1  1 

我已經開始使用Pivot查詢。但是,我還沒有得到好的結果。 這是整個結構以及查詢和輸出。

表結構:

CREATE TABLE TableA (
    [ID] INT IDENTITY(1,1) NOT FOR REPLICATION NOT NULL 
    , [Description] NVARCHAR(50) NULL 
    , [Code] NVARCHAR(10) NULL) 

CREATE TABLE TableB (
    [ID] INT IDENTITY(1,1) NOT FOR REPLICATION NOT NULL 
    , [TableA_ID] INT NULL 
    , [TableA_ID_Relation] INT NULL) 

INSERT INTO TableA([Description], [Code]) 
VALUES('Desc1','CodeA') 
,('Desc2','CodeB') 
,('Desc3','CodeC') 
,('Desc4','CodeD') 
,('Desc5','CodeE') 

INSERT INTO TableB([TableA_ID], [TableA_ID_Relation]) 
VALUES(1,1) 
,(1,2) 
,(2,1) 
,(2,2) 
,(2,3) 
,(2,4) 
,(3,2) 
,(3,3) 
,(4,1) 
,(4,3) 
,(4,4) 
,(1,1) 
,(2,2) 
,(3,3) 
,(4,4) 
,(5,5) 

查詢:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(Code) 
        FROM TableA 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 
PRINT @cols 
set @query = 'SELECT ID,Description, ' + @cols + ' from 
      (
        SELECT A.ID, A.Description, A.Code, B.TableA_ID_Relation 
        FROM TableA A 
        LEFT OUTER JOIN TableB B ON B.TableA_ID_Relation = A.ID 
      ) x 
      pivot 
      (
       MAX(Code) 
       for Code in (' + @cols + ') 
      ) p ' 

PRINT @query 
execute(@query); 

而結果雖然不是我想要的東西;

enter image description here

到目前爲止,我已經嘗試做一個查詢,它並不順利。 在我進行某種複雜的開發之前,我想聽聽您的可能意見。

回答

1

P.s.
樣本集是剛剛的例子中的一個子集給


DECLARE @cols AS NVARCHAR(MAX), 
    @cols_isnull AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(Code) 
        FROM TableA 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 

select @cols_isnull = STUFF((SELECT ',isnull(' + QUOTENAME(Code) + ',0) as ' + QUOTENAME(Code) 
        FROM TableA 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 

PRINT @cols 
set @query = 'SELECT id,description,code,' + @cols_isnull + ' from 
      (
        SELECT a1.id,a1.code,a1.Description,a2.Code as code2,1 as indication 
        FROM   TableB b 
         join TableA a1 
         on  a1.id = b.TableA_ID 
         join TableA a2 
         on  a2.id = b.TableA_ID_Relation 
      ) x 
      pivot 
      (
       MAX(indication) 
       for Code2 in (' + @cols + ') 
      ) p 
' 

PRINT @query 
execute(@query); 
+0

非常感謝嘟嘟,非常接近!是否有機會在說明欄旁邊添加「代碼」列以便給出這是一個交叉匹配圖的印象? CodeA <> CodeA,CodeB <> CodeB ... – Sener

+0

@Sener,fixed .... –

+0

讚賞您的幫助。我還修正了一個小故障,將返回的BIT值從1和0之間反轉。 – Sener