Sql server 在动态数据透视中使用临时表
我试图在动态透视查询中使用临时表。我已经读到该过程将不起作用,因为temp表不在范围内,即使它是一个全局表。这对我来说很奇怪,因为它可以在sql FIDLE中工作,但不能在sql Server 2012中工作。我如何编辑我的查询,使其提供除受影响的xxx行以外的输出 我的问题是:Sql server 在动态数据透视中使用临时表,sql-server,pivot,unpivot,Sql Server,Pivot,Unpivot,我试图在动态透视查询中使用临时表。我已经读到该过程将不起作用,因为temp表不在范围内,即使它是一个全局表。这对我来说很奇怪,因为它可以在sql FIDLE中工作,但不能在sql Server 2012中工作。我如何编辑我的查询,使其提供除受影响的xxx行以外的输出 我的问题是: SELECT cc.CaseCaseId AS CaseId, cc.Label AS CaseName, rce.EcoDate, cc.OperatorName, cc.State, cc.Cou
SELECT cc.CaseCaseId AS CaseId, cc.Label AS CaseName, rce.EcoDate, cc.OperatorName, cc.State, cc.County, ei.IROR, rce.NDCash
into ##Temp2
FROM PhdRpt.ReportCaseList_542 AS rcl INNER JOIN
CaseCases AS cc ON rcl.CaseCaseId = cc.CaseCaseId INNER JOIN
PhdRpt.RptCaseEco_542 AS rce ON rcl.ReportRunCaseId = rce.ReportRunCaseId INNER JOIN
PhdRpt.EcoIndicators_542 AS ei ON rcl.ReportRunCaseId = ei.ReportRunCaseId
DECLARE @colsPivot AS NVARCHAR(MAX),
@colsUnpivot as NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(EcoDate)
from ##Temp2
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id('##Temp2') and
C.name LIKE 'NDCash%'
for xml path('')), 1, 1, '')
set @query
= 'select *
from
(
select cc.CaseCaseId AS CaseId, cc.Label AS CaseName, rce.EcoDate, cc.OperatorName, cc.State, cc.County, ei.IROR, val, col
FROM ##Temp2
unpivot
(
val
for col in ('+ @colsunpivot +')
) u
) x1
pivot
(
max(val)
for EcoDate in ('+ @colspivot +')
) p'
exec(@query)
Drop table ##Temp2
以下是表格结构:
CaseId EcoDate NDCash
2 2003-01-01 26.6384943638238
2 2004-01-01 23.9534867373416
2 2005-01-01 25.9197356158675
2 2006-01-01 25.3280437702064
2 2007-01-01 24.9828609298022
2 2008-01-01 26.4019321789285
2 2009-01-01 26.6384943638238
2 2010-01-01 24.0660715481002
2 2011-01-01 26.6384943638238
2 2012-01-01 22.5718444448345
2 2013-01-01 26.6384943638238
改变exec@query到sp_executeSQl@query
exec@query不会在当前上下文中执行,但sp_executeSQL将在包含临时表的当前上下文中执行。除非我遗漏了什么,否则不需要为此使用UNPIVOT,也不需要使用临时表,直接查询数据即可。看起来您当前的查询只取消了一个不需要的列。可以使用unpivot将多列转换为多行 您应该能够使用:
DECLARE @colsPivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @colsPivot = STUFF((SELECT ',' + QUOTENAME(rce.EcoDate)
from PhdRpt.RptCaseEco_542 AS rce
group by rce.EcoDate
order by rce.EcoDate
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'select *
from
(
SELECT cc.CaseCaseId AS CaseId,
cc.Label AS CaseName,
rce.EcoDate,
cc.OperatorName,
cc.State,
cc.County,
ei.IROR,
rce.NDCash
FROM PhdRpt.ReportCaseList_542 AS rcl
INNER JOIN CaseCases AS cc
ON rcl.CaseCaseId = cc.CaseCaseId
INNER JOIN PhdRpt.RptCaseEco_542 AS rce
ON rcl.ReportRunCaseId = rce.ReportRunCaseId
INNER JOIN PhdRpt.EcoIndicators_542 AS ei
ON rcl.ReportRunCaseId = ei.ReportRunCaseId
) x1
pivot
(
max(NDCash)
for EcoDate in ('+ @colspivot +')
) p'
exec(@query)
使用全局临时表的一个更直接的问题是,这实际上将并发性限制为1。当两个用户同时运行此代码时,您认为会发生什么情况?@AaronBertrand您有什么建议作为解决方案?我是SQL的新手,所以任何建议都非常感谢。我甚至还没有试着去解决你的问题。我只知道全局临时表很少是正确的解决方案。为什么您认为这些方法中的一种在相同的上下文中工作,而另一种却不工作?这里没有问题:创建表席int;插入x选择1;EXEC'SELECT i FROM x;';EXEC sp_executesql N'SELECT i FROM x;';下降表x@Surendra Nath GM我已经更改了它,但它仍然无法执行。非常感谢蓝脚。如果有另一列,比如说折扣,我希望它们都被旋转,那么我会使用unpivot吗?是的,当你有多个列要旋转时,你需要取消pivot。@RolandP这就是为什么你不沉默或简化你的问题-人们最终解决了更简单的问题,给你留下问题和进一步的问题需要解决。@AaronBertrand谢谢你的建议。我试图简化它,以便您可以看到我试图实现的目标。@我在unpivot中添加了BlueFoots,并在查询中添加了第二个C.名称,如“”,我得到的错误是在unpivot运算符的列列表中多次指定了NetGas列。你知道我为什么会犯这个错误吗?