Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在动态数据透视中使用临时表_Sql Server_Pivot_Unpivot - Fatal编程技术网

Sql server 在动态数据透视中使用临时表

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

我试图在动态透视查询中使用临时表。我已经读到该过程将不起作用,因为temp表不在范围内,即使它是一个全局表。这对我来说很奇怪,因为它可以在sql FIDLE中工作,但不能在sql Server 2012中工作。我如何编辑我的查询,使其提供除受影响的xxx行以外的输出

我的问题是:

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列。你知道我为什么会犯这个错误吗?