【问题标题】:SQL Pivot IssueSQL 枢轴问题
【发布时间】:2014-05-06 13:44:03
【问题描述】:

如果你能帮忙的话。代码生成错误: 消息 8156,第 16 层,状态 1,第 236 行 为“piv1”多次指定了“Classification_Value_Id”列。

我在 SQL Server 上执行此操作。代码步骤如下: 1. 将源表 DB.[dbo].[Classification] 中的数据反透视成一列 2. 将此未透视数据加入到名为 DB.dbo.[Classification_Value] 的表中,以将列“cv.Classification_Name”返回/添加到数据集中 3. 透视这个数据集(这是返回错误的部分)

代码:

SELECT
       activityCode
     , actjvPartnerRef
     , actMonth
     , actSalesChannel
     , addCBPCharge
     , agentId
     , appType
     , areaCode

--SELECT
--polRef,[Arrangement_Id],UnpivotedData.Classification_Value_Id,UnpivotedData.Classification_Scheme_Id,ColValues, ColNames,cv.Classification_Name

FROM
(
    SELECT top 10
           [polRef]
         , [Arrangement_Id]
         , [Classification_Scheme_Id]
         , [Classification_Value_Id]
       -- ,[Arrangement_Classification_Type_Id]
       -- ,[Effective_TimeStamp]
       -- ,[End_date]
         , CAST((ISNULL([character_measure],'')) AS NVARCHAR(MAX)) AS character_measure
         , CAST((ISNULL([datetime_measure],'')) AS NVARCHAR(MAX)) AS datetime_measure
         , CAST([decimal_measure] AS NVARCHAR(MAX)) AS decimal_measure
         , CAST((ISNULL([integer_measure],'')) AS NVARCHAR(MAX)) AS integer_measure
         , CAST((ISNULL([logical_measure],'')) AS NVARCHAR(MAX)) AS logical_measure
         , CAST((ISNULL([charmax_measure],'')) AS NVARCHAR(MAX)) AS charmax_measure
         , CAST((ISNULL([long_measure],'')) AS NVARCHAR(MAX)) AS long_measure
      FROM DB.[dbo].[Classification] 
) AS SrcDataConverted

UNPIVOT
(
ColValues FOR ColNames IN
(
     character_measure
   , datetime_measure
   , decimal_measure
   , integer_measure
   , logical_measure
   , charmax_measure
   , long_measure
)
) AS UnpivotedData

LEFT JOIN DB.dbo.[Classification_Value] cv
ON  cv.[Classification_Scheme_Id] = UnpivotedData.[Classification_Scheme_Id]
AND cv.Classification_Value_Id = UnpivotedData.Classification_Value_Id

PIVOT
(MAX(ColValues) for Classification_Name in (
    activityCode
  , actjvPartnerRef
  , actMonth
  , actSalesChannel
  , addCBPCharge
  , agentId
  , appType
  , areaCode
)) AS piv1; 

任何帮助将不胜感激

谢谢

【问题讨论】:

    标签: sql sql-server pivot unpivot


    【解决方案1】:

    StuarLC: 另一个派生表需要在开始重新 PIVOT 之前包装 UNPIVOT 的结果,因为连接引入了重复的 Classification_Value_Id 和 Classification_Scheme_id,这是连接所必需的。

    select 
           activityCode
         , actjvPartnerRef
         , actMonth
         , actSalesChannel
         , addCBPCharge
         , agentId
         , appType
         , areaCode
    from (
       SELECT polRef
            , [Arrangement_Id]
            , UnpivotedData.Classification_Value_Id
            , UnpivotedData.Classification_Scheme_Id
            , ColValues
            , ColNames
            , Classification_Name
        FROM (
            SELECT [polRef]
                 , [Arrangement_Id]
                 , [Classification_Scheme_Id]
                 , [Classification_Value_Id]
                 , CAST((ISNULL([character_measure],'')) AS NVARCHAR(MAX)) AS character_measure
                 , CAST((ISNULL([datetime_measure],'')) AS NVARCHAR(MAX)) AS datetime_measure
                 , CAST([decimal_measure] AS NVARCHAR(MAX)) AS decimal_measure
                 , CAST((ISNULL([integer_measure],'')) AS NVARCHAR(MAX)) AS integer_measure
                 , CAST((ISNULL([logical_measure],'')) AS NVARCHAR(MAX)) AS logical_measure
                 , CAST((ISNULL([charmax_measure],'')) AS NVARCHAR(MAX)) AS charmax_measure
                 , CAST((ISNULL([long_measure],'')) AS NVARCHAR(MAX)) AS long_measure
              FROM DB.[dbo].[Classification] 
        ) AS SrcDataConverted
        UNPIVOT
        (
            ColValues FOR ColNames IN
            (
                 character_measure
               , datetime_measure
               , decimal_measure
               , integer_measure
               , logical_measure
               , charmax_measure
               , long_measure
            )
        ) AS UnpivotedData
        LEFT JOIN 
            DB.dbo.[Classification_Value] cv
        ON  cv.[Classification_Scheme_Id] = UnpivotedData.[Classification_Scheme_Id]
        AND cv.Classification_Value_Id = UnpivotedData.Classification_Value_Id
    ) as src
    PIVOT
    (   
        MAX(ColValues) for Classification_Name in (
                activityCode
              , actjvPartnerRef
              , actMonth
              , actSalesChannel
              , addCBPCharge
              , agentId
              , appType
              , areaCode
        )
    ) AS piv1; 
    

    【讨论】:

    • +1 - 另一个派生表需要在开始重新 PIVOT 之前包装 UNPIVOT 的结果,因为连接引入了重复的 Classification_Value_IdClassification_Scheme_id,这是加入。 SqlFiddle here
    • @brett 感谢您的回复:以下错误代码:Msg 207, Level 16, State 1, Line 12 列名“activityCode”无效。消息 207,级别 16,状态 1,第 13 行无效的列名称“actjvPartnerRef”。消息 207,级别 16,状态 1,第 14 行无效的列名称“actMonth”。 ..... 消息 265,级别 16,状态 1,第 56 行 PIVOT 运算符中指定的列名“activityCode”与 PIVOT 参数中的现有列名冲突。消息 265,第 16 级,状态 1,第 57 行 ...
    • 我已经按照提供的小提琴更正了我的代码(谢谢@StuartLC)。我以为你只是从他的小提琴中拿走了这个版本(已经奏效了)。
    • @Aarion 去这里:sqlfiddle.com/#!3/a2ac0/2 然后编辑架构。完成后,在此处发布新网址
    • @StuartLC 和 Brett 我已经在 sqlfiddle 上构建了架构并上传了 SQL 代码sqlfiddle.com/#!3/30da24
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2020-07-22
    相关资源
    最近更新 更多