2013-03-25 57 views
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) 

目前我已經在第一情侶我的臨時表的coloumns的所有數據(2),但之後,我有22 coloumns,我應該填充另一個臨時表(1)的數據。

在臨時表(1)I擁有所有數據水平地顯示:

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

如上所示,我需要臨時表(1)來填充臨時表(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| 

這是我目前使用的與解決方案從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 

--Temp表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; 

END

我仍然這樣做時會出錯。

+1

什麼是垂直插入的SQL Fiddle with Demo?你能在之前和之後發佈數據的例子嗎? – Oded 2013-03-25 14:51:08

+0

嗨Oded,我會馬上更新。 – PKirby 2013-03-25 15:03:55

+0

已更新。希望你有想法.. – PKirby 2013-03-25 15:26:53

回答

1

您的問題並不完全清楚,但您可以應用UNPIVOT函數將列中的數據轉換爲行或將行轉換爲列。

一旦數據達到您需要的格式,您可以根據需要INSERT

PIVOT:

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 

看到兩個版本

+0

嗨Bluefeet,感謝您的答覆。我已經嘗試過,但仍然有錯誤。 「將數據類型nvarchar轉換爲bigint時出錯」,其中很多。我已經使用代碼更新了原始帖子,以幫助澄清我想要做的事情。希望這可以幫助? – PKirby 2013-03-26 09:02:24

+0

@ user2145342你能用你的表格結構和一些樣本數據編輯[SQL小提琴](http://sqlfiddle.com/#!3/8ecde/4)嗎? – Taryn 2013-03-26 09:51:19

+0

我已經嘗試過,但無法弄清楚。我可以向你發送表1和表2中的值,我從中得到: - SELECTELES FROM AnswersTempTable和--SELECT * FROM ResultTempTable? – PKirby 2013-03-26 10:10:26