2014-11-06 150 views
1

我有一个POA代码动态数据透视表,它从DX临时表中提取数据并将数据插入到临时POA表中。
我遇到的问题是可能会返回多达35个不同的列。根据月份可能会有15列(POA1...POA15)或可能有35列(POA1...POA35)。我加入另一个病人表上的这个动态枢轴温度表。我的问题是,即使某些列不存在于临时POA表中,我也需要显示全部35列。不同列的动态枢轴

--Pivot DX POA Codes 
DECLARE @POANAME VARCHAR(40) 
SELECT @POAName = '##tmpPOA' 

DECLARE @colsPOA NVARCHAR(2000) 

SELECT @colsPOA = STUFF((SELECT DISTINCT TOP 100 PERCENT 
    '],[' + 'POA' + CAST(Dx.RowNum AS NVARCHAR) 
    FROM #tmpDX DX 
    ORDER BY '],[' + 'POA' + CAST(Dx.RowNum AS NVARCHAR) 
    FOR XML PATH ('') 
    ),1,2,'') + ']' 

DECLARE @queryPOA NVARCHAR(4000) 

SET @queryPOA = 'N 
    SELECT 
     EncObjID, 
     '+ 
     @colsPOA 
     +' INTO ' + POAName + ' 
     FROM 
     (SELECT 
      Dx.EncObjID 
      ,''POA'' + Dx.RowNum AS RowNum 
      ,Dx.POAMne 
     FROM #tmpDx Dx 
     ) p 
     PIVOT 
      (
      MIN([POAMne]) 
      FOR RowNum IN 
      (' + @colsPOA + ') 
      ) AS pvt' 
EXECUTE(@queryPOA) 

我在我的病人查询接收了无效的列名,因为一些列不存在##tmpPOA。我想创建一个名为#tmpDxPOA的临时表并执行插入操作(Insert Into #tmpDxPOA select * from ##tmpPOA),但这不起作用(我收到一个列名或提供的值数与错误不匹配)。

有关如何创建所有35列即使没有任何数据的任何想法?我不在乎他们是否为空,我只需要在主要患者查询中拥有这些占位符,并且不能帮助每个月返回的列数不同。

+0

跟着你的逻辑与你需要的所有列的另一个表,35 POA,插入也需要是动态的,并且只插入你所做的关键点的列..类似于“insert into #othertable(”+ )从POAName select * from #othertable“ – mxix 2014-11-06 17:33:22

+0

中选择”+ colsPOA +“您可以在表示层处理它吗? – Beth 2014-11-06 17:36:50

+0

@Beth - 不,我将这些数据和患者数据放入另一个提供许多联合查询的临时表中。我想我可以在创建动态列的查询中对列名进行硬编码。 – JohnD 2014-11-06 17:45:04

回答

0

随着@mxix的帮助下,我能够想出如下:

DECLARE @POASQL NVARCHAR(MAX) 
SET @POASQL = N'INSERT INTO #tmpPOAFinal (EncObjID,'[email protected]+') SELECT * FROM ##tmpPOA' 
EXECUTE(@POASQL) 

我在主查询把这个在EXECUTE(@queryPOA)后。

0

为了使其与Dynamic SQL协同工作,行/列需要存在超过零次。无论是针对一名或多名患者。我会尝试将POA的可能性数量从蝙蝠中分离出来,然后离开外部连接以获取实际值。

IF OBJECT_ID('tempdb..#tmpPOA') IS NOT NULL DROP TABLE #tmpPOA 
CREATE TABLE #tmpPOA (POA varchar(10)) 

IF OBJECT_ID('tempdb..#tmpPatient') IS NOT NULL DROP TABLE #tmpPatient 
CREATE TABLE #tmpPatient (Patient varchar(15)) 
INSERT INTO #tmpPatient VALUES ('ABC123'),('ABC456'),('ABC789') 


DECLARE @POAFlag as INT = 0 

WHILE @POAFlag <36 
BEGIN 
INSERT INTO #tmpPOA 
VALUES('POA' +CONVERT(varchar,@POAFlag)) 
SET @POAFlag = @POAFlag + 1 

END 
SELECT * FROM #tmpPOA 
CROSS JOIN #tmpPatient 

这应该扇出35DXCodes的所有可能性,让您获得他们的POA标志。