我有一个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 :(得分:0)
在@mxix的帮助下,我能够提出以下内容:
DECLARE @POASQL NVARCHAR(MAX)
SET @POASQL = N'INSERT INTO #tmpPOAFinal (EncObjID,'+@colsPOA+') SELECT * FROM ##tmpPOA'
EXECUTE(@POASQL)
我把它放在EXECUTE(@queryPOA)
的主查询中。
答案 1 :(得分: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
这应该可以为35DXCode提供所有可能性,让您获得POA标志。