我想在存储过程中使用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
应基于Analyte
和concentration
列执行。
标题及其集中所需的Analyte
列的值应填充为行。
答案 0 :(得分:6)
我知道现在回复为时已晚,仅供其他人参考。
首先,在应用PIVOT之后,必须使用为PIVOT子句指定的别名来引用pivoted set的所有列。根据手册:
当派生表,行集或表值函数或运算符时 使用了子句(如PIVOT或UNPIVOT),所需的table_alias位于 子句的结尾是所有列的关联表名, 包括分组列,返回。
如果您使用SELECT
将PVT
列表中的所有列设置为别名,或者您甚至可以删除所有列的别名也可以。