多部分标识符:在SQL存储过程中使用PIVOT时出错

时间:2014-03-12 13:08:32

标签: sql-server pivot

我想在存储过程中使用PIVOT来获取行。我所做的是:

DECLARE @cols NVARCHAR(MAX)
DECLARE @stmt NVARCHAR(MAX)

SET @cols = ''

SELECT @cols = @cols + Table3.vAnalyteName+ ','
                                        FROM Table3,Table5,Table6
                                        WHERE Table3.nBAChildProjectsNo = Table5.nBaSequenceScheduleHdrNo
                                              AND Table3.cStatusIndi <> 'D'

SET @cols = substring(@cols, 1, len(RTRIM(@cols)) -1 ) 

--SET @cols = stuff(@cols, 1, 2, '')

SET @stmt = 'SELECT
            Table1.nBaSequenceScheduleHdrNo,
            Table1.vSampleId,
            Table1.vSampleName,
            Table1.iSeqNo,
            Table1.vSampleType,
            Table2.vInjectionVolume,
            Table3.vAnalyteName,
            Table4.nConcentration,
            Table1.cStatusIndi

        FROM Table1

                INNER JOIN Table5
                      ON(Table5.nBaSequenceScheduleHdrNo =  Table1.nBaSequenceScheduleHdrNo
                         AND Table5.cStatusIndi <> ''D'')

                INNER JOIN Table2
                      ON(Table2.nBAchildProjectsNo = Table5.nBAchildProjectsNo
                         AND Table2.cStatusIndi <> ''D'')

                INNER JOIN Table3
                      ON(Table3.nBAchildProjectsNo = Table5.nBAchildProjectsNo
                         AND Table3.cStatusIndi <> ''D'')

                LEFT JOIN Table6
                     ON(Table6.nBAchildProjectsNo = Table5.nBAchildProjectsNo
                        AND Table6.nBAProjectAnalyteDtlNo = Table3.nBAProjectAnalyteDtlNo
                        AND Table6.cStatusIndi <> ''D'')

                LEFT JOIN Table4
                     ON(Table4.nBAAnalyteSampleHdrNo = Table6.nBAAnalyteSampleHdrNo
                        AND Table4.vSampleID =  Table1.vSampleId
                        AND Table4.cStatusIndi <> ''D'')

        PIVOT (
                SUM(Table4.nConcentration) FOR Table3.vAnalyteName IN ( ' + @cols + ' )
              ) AS PVT'
exec(@stmt)

但我收到的 Multipart Identifier 错误如下:

  

Msg 8156,Level 16,State 1,Line 38
  'PVT'多次指定了'nBaSequenceScheduleHdrNo'列。
  消息4104,级别16,状态1,行2   无法绑定多部件标识符“Table1.nBaSequenceScheduleHdrNo”。
  消息4104,级别16,状态1,行3   无法绑定多部分标识符“Table1.vSampleId”   消息4104,级别16,状态1,行4   无法绑定多部分标识符“Table1.vSampleName”   消息4104,级别16,状态1,行5   无法绑定多部分标识符“Table1.iSeqNo”   Msg 4104,Level 16,State 1,Line 6
  无法绑定多部分标识符“Table1.vSampleType”   Msg 4104,Level 16,State 1,Line 7
  无法绑定多部分标识符“Table2.vInjectionVolume”   ......

我第一次使用PIVOT。所以请光着它。如果我能用解决方案处理这个错误,请告诉我。

我想在这里做的是,获取SELECT中PIVOT Analyte列的所有列。 Pivot应基于Analyteconcentration列执行。

标题及其集中所需的Analyte列的值应填充为行。

1 个答案:

答案 0 :(得分:6)

我知道现在回复为时已晚,仅供其他人参考。

首先,在应用PIVOT之后,必须使用为PIVOT子句指定的别名来引用pivoted set的所有列。根据手册:

  

当派生表,行集或表值函数或运算符时   使用了子句(如PIVOT或UNPIVOT),所需的table_alias位于   子句的结尾是所有列的关联表名,   包括分组列,返回。

如果您使用SELECTPVT列表中的所有列设置为别名,或者您甚至可以删除所有列的别名也可以。