2017-04-21 12 views
1

PersonIDの数値をパラメータとして使用して、2つのテーブルからデータを取得できるストアドプロシージャを作成しています。 Iは複数の列にわたって非凝集と異なるテーブルでONE列からデータを取得して動的にDataテーブルを旋回する旋回機能を使用して考えます。以下の2つの表は、データテーブルのための100以上のカラムを持つサンプルデータです。したがって、ダイナミックパートです。 2つのテーブルには、共通のID列はなく、共通の列名のみがあります。複数の列をSQLの動的ピボットに集約する

マッピングテーブル:

CREATE table #table (
ID varchar(10) NOT NULL, 
Column_Name varchar (255) NOT NULL, 
Page_Num varchar(10) NOT NULL, 
Line_Num varchar(10) NOT NULL, 
Element_Num varchar(10) NOT NULL 
) 

INSERT INTO #table (ID,Column_Name,Page_Num,Line_Num,Element_Num) VALUES ('1','Name', 'DT-01', '200','20') 
INSERT INTO #table (ID,Column_Name,Page_Num,Line_Num,Element_Num) VALUES ('2','SSN', 'DT-02', '220','10') 
INSERT INTO #table (ID,Column_Name,Page_Num,Line_Num,Element_Num) VALUES ('3','City', 'DT-03', '300','11') 
INSERT INTO #table (ID,Column_Name,Page_Num,Line_Num,Element_Num) VALUES ('4','StreetName', 'DT-04', '350','33') 
INSERT INTO #table (ID,Column_Name,Page_Num,Line_Num,Element_Num) VALUES ('5','Sex', 'DT-05', '310','51') 

が作成:

ID Column_Name  Page_Num Line_Num Element_Num 
_________________________________________________________________ 
    1 Name    DT-01   200   20 
    2 SSN    DT-02   220   10 
    3 City    DT-03   300   11 
    4 StreetName  DT-04   350   33 
    5 Sex    DT-05   310   51 

データテーブル:

CREATE table #temp (
PersonID varchar (100) NOT NULL, 
Name varchar(100) NOT NULL, 
SSN varchar (255) NOT NULL, 
City varchar(100) NOT NULL, 
StreetName varchar(100) NOT NULL, 
Sex varchar(100) NOT NULL 
) 


INSERT INTO #temp (PersonID,Name,SSN,City,StreetName,Sex) VALUES ('112','Joe','945890189', 'Lookesville', 'Broad st','Male') 
INSERT INTO #temp (PersonID,Name,SSN,City,StreetName,Sex) VALUES ('140','Santana','514819926', 'Falls Church', 'Gane Rd', 'Female') 
INSERT INTO #temp (PersonID,Name,SSN,City,StreetName,Sex) VALUES ('481','Wyatt','014523548','Gainesville', 'Westfield blvd', 'Male') 
INSERT INTO #temp (PersonID,Name,SSN,City,StreetName,Sex) VALUES ('724','Brittany','551489230','Aldi', 'Ostrich rd', 'Female') 
INSERT INTO #temp (PersonID,Name,SSN,City,StreetName,Sex) VALUES ('100','Giovanni','774451362','Paige', 'Company ln', 'Male') 

が作成:ここ 2つのテーブルである

PersonID Name   SSN   City   StreetName  Sex 
    _______________________________________________________________________ 
    112  Joe  945890189  Lookesville   Broad st  Male 
    140 Santana 514819926  Falls Church  Gane Rd  Female 
    481  Wyatt 014523548  Gainesville   Westfield rd Male 
    724 Brittany 551489230  Aldi    Ostrich rd Female 
    100 Giovanni 774451362  Paige    Company ln Male 

最終結果は次のようになります 例:ユーザー= 140 PersonID

Column_name Page_Num  Line_Num  Element_Num  Data 
    _____________________________________________________________________________ 
    Name   DT-01   200    20    Santana 
    SSN   DT-02   220    10    514819926 
    City   DT-03   300    11   Falls Church 
    StreetName DT-04   350    33    Gane Rd 
    Sex   DT-05   310    51    Female 
    ...   ...   ...    ...    ... 

パラメータを入力し、そうで..

答えて

0

以下は、動的データ列アンピボットし、その後に参加を実行しますフィールド名にdefデータを指定します。

あなたはフィルターなしでこのクエリを実行したい場合は、私がトップSELECTA.PersonIDを追加することを提案し、私は追加する必要がありますWHERE

を削除し、UNPIVOTが、よりパフォーマンスが、このアプローチになります値を定義および/または再作成する必要はありません。それは、パフォーマンスはまだ非常に尊敬できると述べた。

Select D.* 
     ,Data=C.Value 
From #Temp A 
Cross Apply (Select XMLData = cast((Select A.* For XML Raw) as xml)) B 
Cross Apply (
       Select Item = attr.value('local-name(.)','varchar(100)') 
         ,Value = attr.value('.','varchar(max)') 
       From B.XMLData.nodes('/row') as X(r) 
       Cross Apply X.r.nodes('./@*') AS N(attr) 
      ) C 
Join #Table D on (C.Item=D.Column_Name) 
Where PersonID=140 

戻り

enter image description here

それが可視化に役立ちます場合は、CROSSが適用さCは、次を生成します。

enter image description here

EDIT - ストアドプロシージャ

CREATE PROCEDURE [dbo].[YourProcedureName](@PersonID int) 

As 

Begin 
    Set NoCount On; 

    Select D.* 
      ,Data=C.Value 
    From YourPersonTableName A 
    Cross Apply (Select XMLData = cast((Select A.* For XML Raw) as xml)) B 
    Cross Apply (
        Select Item = attr.value('local-name(.)','varchar(100)') 
          ,Value = attr.value('.','varchar(max)') 
        From B.XMLData.nodes('/row') as X(r) 
        Cross Apply X.r.nodes('./@*') AS N(attr) 
       ) C 
    Join YourObjectTableName D on (C.Item=D.Column_Name) 
    Where [email protected] 

End 
+0

のように更新の答えを参照してください@BetaData。私はストアドプロシージャを追加しました。あなたはYourPersonTableNameとYourObjectNameを提供する必要があります。 –

+0

ありがとうございます。Cでのクロス適用について説明してください。クロスアプリケーションの使用法を理解していますが、「attr.value」が何をしているのか分かりません。そのデータ型に列を帰属させていますか? – BetaData

+0

@BetaData Cross Apply Bは、行をXML Rawに変換します。各フィールドはノードではなくATTRIBUTEです。たとえば、データ行は次のようになります。 .....次に、クロス・アプライCは各属性/値を行に変換します。 –

関連する問題