【问题标题】:Multi-part Identifier : Error while using PIVOT in SQL stored procedure多部分标识符:在 SQL 存储过程中使用 PIVOT 时出错
【发布时间】:2016-01-15 20:54:43
【问题描述】:

我想在存储过程中使用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 的错误如下:

消息 8156,第 16 层,状态 1,第 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”。
消息 4104,第 16 级,状态 1,第 6 行
无法绑定多部分标识符“Table1.vSampleType”。
消息 4104,第 16 级,状态 1,第 7 行
无法绑定多部分标识符“Table2.vInjectionVolume”。
......

我是第一次使用 PIVOT。所以请尽情享受吧。如果我能用解决方案处理这个错误,请告诉我。

我在这里要做的是,用 PIVOT 的Analyte 列获取SELECT 中的所有列。并且Pivot 应该在Analyteconcentration 列的基础上执行。

标题中需要的Analyte列的值及其浓度应填写为行。

【问题讨论】:

标签: sql-server pivot


【解决方案1】:

我知道现在回复太晚了,仅供其他人参考..

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

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

如果您使用PVTSELECT 列表中的所有列起别名就可以了,或者您甚至可以删除所有列的别名也可以。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 2020-06-16
    • 2016-10-28
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多