0

上記のように。SQLで2つの一時テーブルを作成しました。すべての列を完了するには垂直方向に挿入する必要がありますが、理解しているように、データは水平方向にしか挿入できませんか?

これを回避する方法はありますか?

例 :

ForgeinKey  |  Q1  |  Q2  |  Q3  |  Q4  |  Q5  | 
   1234     |    1 |     1|    0 |    2 |     0|
   1235     |    0 |     2|    1 |    2 |     0|
   1236     |    2 |     2|    0 |    0 |     1|

私が推測するのは、次のようなものです。

ForgeinKey  |  Q1  |  Q2  |  Q3  |  Q4  |  Q5 |
   1234     | 1    |NULL  | NULL |  NULL| NULL|
   1234     |NULL  | 1    | NULL |  NULL| NULL|
   1234     |NULL  |NULL  |  0   |  NULL| NULL|
   1234     |NULL  |NULL  | NULL |    2 | NULL|
   1234     |NULL  |NULL  | NULL |  NULL|   0 |      (etc)

現在、一時テーブルの最初の2つの列にすべてのデータがありますが(2)、その後は22の列があり、別の一時テーブルのデータを入力する必要があります(1)。

一時テーブル(1)には、すべてのデータが水平方向に表示されています。

Answers  |  Questions  |  ForeignKey
   1     |      Q1     |       1234     
   1     |      Q2     |       1234  
   0     |      Q3     |       1234  
   2     |      Q4     |       1234  
   0     |      Q5     |       1234  

上に示したように、行を識別するために外部キーを使用して一時テーブル(2)に垂直にデータを入力するには、一時テーブル(1)が必要です。

ForgeinKey  |  Q1  |  Q2  |  Q3  |  Q4  |  Q5|
   1234     |    1 |     1|    0 |     2|   0|
   1235     |    0 |     2|    1 |     2|   0|
   1236     |    2 |     2|    0 |     0|   1|

これは、私が現在bluefeetのソリューションで使用しているコードです。

BEGIN
SET DATEFORMAT ymd;


--Temp Table 1 (Answers)
DECLARE @AnswersTempTable TABLE
(
    tblManagerSpotCheckAnswer_ID    bigint, 
    lManagerSpotCheck_ID            bigint, 
    lManagersSpotCheckQuestion_ID   bigint, 
    lManagersSpotCheckAnswer        int, 
    sDescription                    varchar(100)
)

INSERT INTO @AnswersTempTable
SELECT     tblManagerSpotCheckAnswers.tblManagerSpotCheckAnswer_ID,           tblManagerSpotCheckAnswers.lManagerSpotCheck_ID, 
                  tblManagerSpotCheckAnswers.lManagersSpotCheckQuestion_ID,   tblManagerSpotCheckAnswers.lManagersSpotCheckAnswer, 
                  tblManagerSpotCheckQuestions.sDescription
FROM         tblManagerSpotCheckAnswers INNER JOIN
                      tblManagerSpotChecks ON   tblManagerSpotCheckAnswers.lManagerSpotCheck_ID = tblManagerSpotChecks.lManagerSpotCheck_ID     INNER JOIN
                      tblManagerSpotCheckQuestions ON 
                      tblManagerSpotCheckAnswers.lManagersSpotCheckQuestion_ID = tblManagerSpotCheckQuestions.lManagersSpotCheckQuestion_ID LEFT OUTER JOIN
                      tblCallDiary ON tblManagerSpotChecks.lCallDiary_ID = tblCallDiary.lCallDiary_ID
WHERE     (tblCallDiary.lCycle_ID = @lCycle_ID) AND (tblManagerSpotChecks.lRMStaff_ID = @Staff_ID)
ORDER BY tblManagerSpotChecks.lManagerSpotCheck_ID

--SELECT * FROM @AnswersTempTable

-温度表2(結果)

DECLARE @ResultTempTable    TABLE
(
    Completed_Date          date, 
    Call_Date               date,
    Outlet                  varchar(100), 
    Channel_Manager         varchar(100), 
    Area                    varchar(100), 
    TE                      varchar(100), 
    Spot_Checker            varchar(100), 
    lChannel_ID             bigint, 
    lManagerSpotCheck_ID    bigint,
    lCycle_ID               int,
    All_Handsets_displayed  int,
    All_Starter_Packs_displayed int,
    Handset_stock_rotated   int,
    Starter_Pack_stock_rotated  int,
    All_Handsets_priced_correctly   int,
    All_Starter_Packs_priced_correctly  int,
    All_Handsets_Starter_Packs_Orders_Checked   int,
    Stock_order_placed  int,
    Minimum_Handset_stock_in_store  int,
    Minimum_Starter_Pack_stock_in_store int,
    Latest_Deal_Generic_poster_on_display   int,
    Branding_as_per_Planogram   int,
    Sufficient_Contract_Forms   int,
    Sufficient_Brochures_in_store   int,
    Kiosk_functional    int,
    Cycle_Objective_Training    int,
    All_staff_trained_on_all_modules    int,
    Closed_group_training_session_booked    int,
    Outlet_is_able_to_RICA_8ta_starter_packs    int,
    All_OBF_Repairs_actioned    int,
    TE_Known_to_Store_Manager   int,
    Escalated_Relationship_issues   int
)

INSERT INTO @ResultTempTable(Completed_Date, Call_Date, Outlet, Channel_Manager, Area,  TE, Spot_Checker, lChannel_ID, lManagerSpotCheck_ID, lCycle_ID)
        SELECT DISTINCT 
                      tblManagerSpotChecks.dDateCaptured AS [Completed Date], tblManagerSpotChecks.dCallDate AS [Call Date], tblSites.sSitename AS Outlet, 
                      tblChannel.sChannelManager AS [Channel Manager], PC_Location.sDescription AS Area, tblStaff_1.sNameSurname AS TE, tblStaff.sNameSurname AS [Spot Checker], 
                      tblChannel.lChannel_ID, tblManagerSpotChecks.lManagerSpotCheck_ID, tblCallDiary.lCycle_ID
        FROM         tblCallDiary LEFT OUTER JOIN
                              tblStaff AS tblStaff_1 ON tblCallDiary.lStaff_ID = tblStaff_1.lStaff_ID RIGHT OUTER JOIN
                              tblChannel RIGHT OUTER JOIN
                              PC_Location RIGHT OUTER JOIN
                              tblSites ON PC_Location.lPC_Location_ID = tblSites.lPC_Location_ID ON tblChannel.lChannel_ID = tblSites.lChannel_ID RIGHT OUTER JOIN
                              tblManagerSpotCheckQuestions RIGHT OUTER JOIN
                              tblManagerSpotCheckAnswers RIGHT OUTER JOIN
                              tblStaff RIGHT OUTER JOIN
                              tblManagerSpotChecks ON tblStaff.lStaff_ID = tblManagerSpotChecks.lRMStaff_ID ON 
                              tblManagerSpotCheckAnswers.lManagerSpotCheck_ID = tblManagerSpotChecks.lManagerSpotCheck_ID ON 
                              tblManagerSpotCheckQuestions.lManagersSpotCheckQuestion_ID = tblManagerSpotCheckAnswers.lManagersSpotCheckQuestion_ID ON 
                              tblSites.lSites_ID = tblManagerSpotChecks.lSite_ID ON tblCallDiary.lSite_ID = tblSites.lSites_ID
        WHERE     (tblManagerSpotChecks.dDateCaptured IS NOT NULL) AND (tblStaff.lStaff_ID = @Staff_ID) AND 
                              (tblCallDiary.lCycle_ID = @lCycle_ID)
        ORDER BY tblManagerSpotChecks.lManagerSpotCheck_ID

--SELECT * FROM @ResultTempTable


--SOLUTION FROM bluefeet
SELECT      Completed_Date           
            ,Call_Date              
            ,Outlet                 
            ,Channel_Manager            
            ,Area                   
            ,TE                      
            ,Spot_Checker            
            ,lChannel_ID                 
            ,lManagerSpotCheck_ID   
            ,lCycle_ID              
            ,All_Handsets_displayed 
            ,All_Starter_Packs_displayed    
            ,Handset_stock_rotated  
            ,Starter_Pack_stock_rotated 
            ,All_Handsets_priced_correctly  
            ,All_Starter_Packs_priced_correctly 
            ,All_Handsets_Starter_Packs_Orders_Checked  
            ,Stock_order_placed 
            ,Minimum_Handset_stock_in_store 
            ,Minimum_Starter_Pack_stock_in_store    
            ,Latest_Deal_Generic_poster_on_display  
            ,Branding_as_per_Planogram  
            ,Sufficient_Contract_Forms  
            ,Sufficient_Brochures_in_store  
            ,Kiosk_functional   
            ,Cycle_Objective_Training   
            ,All_staff_trained_on_all_modules   
            ,Closed_group_training_session_booked   
            ,Outlet_is_able_to_RICA_8ta_starter_packs   
            ,All_OBF_Repairs_actioned   
            ,TE_Known_to_Store_Manager  
            ,Escalated_Relationship_issues
    FROM
    (

        SELECT      tblManagerSpotCheckAnswer_ID     
                    ,lManagerSpotCheck_ID            
                    ,lManagersSpotCheckQuestion_ID   
                    ,lManagersSpotCheckAnswer        
                    ,sDescription   
        FROM    @AnswersTempTable       

    ) src
    pivot
    (
        MAX(lManagersSpotCheckAnswer)
        FOR lManagersSpotCheckQuestion_ID IN    (           All_Handsets_displayed  
                                                            ,All_Starter_Packs_displayed    
                                                            ,Handset_stock_rotated  
                                                            ,Starter_Pack_stock_rotated 
                                                            ,All_Handsets_priced_correctly  
                                                            ,All_Starter_Packs_priced_correctly 
                                                            ,All_Handsets_Starter_Packs_Orders_Checked
                                                            ,Stock_order_placed 
                                                            ,Minimum_Handset_stock_in_store 
                                                            ,Minimum_Starter_Pack_stock_in_store    
                                                            ,Latest_Deal_Generic_poster_on_display  
                                                            ,Branding_as_per_Planogram  
                                                            ,Sufficient_Contract_Forms  
                                                            ,Sufficient_Brochures_in_store  
                                                            ,Kiosk_functional   
                                                            ,Cycle_Objective_Training   
                                                            ,All_staff_trained_on_all_modules   
                                                            ,Closed_group_training_session_booked   
                                                            ,Outlet_is_able_to_RICA_8ta_starter_packs   
                                                            ,All_OBF_Repairs_actioned   
                                                            ,TE_Known_to_Store_Manager  
                                                            ,Escalated_Relationship_issues
                                                )
    )piv;

終わり

これを行うと、まだエラーが発生します。

4

1 に答える 1

1

質問は完全には明確ではありませんが、UNPIVOTデータを列から行に変換するPIVOT関数、または行を列に変換する関数を適用できます。

データが必要な形式になったら、INSERT必要に応じてデータを取得できます。

ピボット:

select ForeignKey, Q1, Q2, Q3, Q4, Q5
from
(
  select ForeignKey, questions, answers
  from table1
) src
pivot
(
  max(answers)
  for questions in (Q1, Q2, Q3, Q4, Q5)
) piv;

UNPIVOT:

select ForgeinKey, questions, answers
from table2
unpivot
(
  answers
  for questions in (Q1, Q2, Q3, Q4, Q5)
) unpiv

両方のバージョンのデモを含むSQLフィドルを参照してください

于 2013-03-25T15:28:13.310 に答える