【问题标题】:Insert Data vertically into temp table using cursor使用光标将数据垂直插入临时表
【发布时间】:2013-03-15 02:48:43
【问题描述】:

如上所述。我在 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) 的前几列中有所有数据,但之后我有 22 个列,我应该用另一个临时表中的数据填充它们 (1)。

在临时表(1) 中,所有数据都水平显示:

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

--温度表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;

结束

执行此操作时我仍然会出错。

【问题讨论】:

  • 什么是垂直插入?你能发布前后的数据示例吗?
  • 嗨,Oded,我马上更新。
  • 已更新。希望你明白..

标签: sql stored-procedures cursor temp-tables


【解决方案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;

反透视:

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

查看两个版本的SQL Fiddle with Demo

【讨论】:

  • 嗨,Bluefeet,感谢您的回复。我已经尝试过了,但仍然出现错误。 “将数据类型 nvarchar 转换为 bigint 时出错”,其中很多。我已经用我用来帮助澄清我想要做什么的代码更新了我的原始帖子。希望这会有所帮助?
  • @user2145342 你能用你的表结构和一些示例数据编辑SQL Fiddle吗?
  • 我已经尝试过,但无法做到。我可以将表 1 和表 2 中的值邮寄给您吗: --SELECT * FROM AnswersTempTable 和 --SELECT * FROM ResultTempTable ?
猜你喜欢
  • 2012-07-31
  • 2013-12-05
  • 2019-12-10
  • 2017-04-02
  • 2016-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多