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標誌。