2016-11-15 6 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 

私はピボットクエリを使い始めました。しかし、私はまだ良い結果を得ることができませんでした。 これは構造全体とクエリと出力です。

表構造:

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

あなたの助けに感謝します。私も1つの小さなグリッチを修正し、1と0の間のリターンBIT値を逆にしました。 – Sener

関連する問題