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 列的任何想法?我不在乎它们是否为空,我只需要在主要患者查询中包含这些占位符,并且返回的列数每个月都不同,这无济于事。

4

2 回答 2

0

在@mxix 的帮助下,我想出了以下几点:

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

我把它EXECUTE(@queryPOA)放在我的主要查询之后。

于 2014-11-06T18:33:05.387 回答
0

为了使它与动态 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 标志。

于 2014-11-06T18:34:58.823 回答