SQL Pivot问题

时间:2014-05-06 13:44:03

标签: sql sql-server pivot unpivot

如果你能帮忙解决这个问题。代码生成错误: Msg 8156,Level 16,State 1,Line 236 列' Classification_Value_Id'被多次指定为' piv1'。

我在SQL Server上这样做。代码的步骤如下: 1.将来自源表DB的数据。[dbo]。[Classification]分解为一列 2.将此不透明数据加入名为DB.dbo的表中。[Classification_Value]返回/添加列" cv.Classification_Name'到数据集 3.旋转此数据集(这是返回错误的部分)

CODE:

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; 

非常感谢任何帮助

谢谢

1 个答案:

答案 0 :(得分:2)

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;