Sql server 具有可变列的动态轴心
我有一个POA代码动态透视,它从DX临时表中提取数据并将数据插入临时POA表。 我遇到的问题是,最多可以返回35个不同的列。根据月份的不同,可能有15列POA1…POA15,也可能有全部35列POA1…POA35。我将这个动态透视临时表连接到另一个患者表上。我的问题是,即使temp POA表中不存在某些列,我也需要显示所有35列Sql server 具有可变列的动态轴心,sql-server,sql-server-2008,pivot,dynamicquery,dynamic-pivot,Sql Server,Sql Server 2008,Pivot,Dynamicquery,Dynamic Pivot,我有一个POA代码动态透视,它从DX临时表中提取数据并将数据插入临时POA表。 我遇到的问题是,最多可以返回35个不同的列。根据月份的不同,可能有15列POA1…POA15,也可能有全部35列POA1…POA35。我将这个动态透视临时表连接到另一个患者表上。我的问题是,即使temp POA表中不存在某些列,我也需要显示所有35列 --Pivot DX POA Codes DECLARE @POANAME VARCHAR(40) SELECT @POAName = '##tmpPOA' DECL
--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的临时表,并从tmpPOA向tmpDxPOA select*执行插入操作,但这不起作用,因为我收到了一个列名或提供的值数量不匹配的错误
关于如何创建所有35列(即使没有任何数据)有何想法?我不在乎它们是否为空,我只需要在主患者查询中有这些占位符,而且每个月返回的列数都不一样也无济于事。在@mxix的帮助下,我能够得出以下结论:
DECLARE @POASQL NVARCHAR(MAX)
SET @POASQL = N'INSERT INTO #tmpPOAFinal (EncObjID,'+@colsPOA+') SELECT * FROM ##tmpPOA'
EXECUTE(@POASQL)
我把这个放在EXECUTE@queryPOA在我的主查询中。为了使用动态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标志。按照您的逻辑,使用另一个包含您需要的所有列的表,即35 POA,insert也需要是动态的,并且只插入您进行透视的列。。类似insert into OTHERSTABLE+colsPOA+select+colsPOA+from POAName select*from OTHERSTABLE您能在演示层处理它吗?@Beth-不,我有这些数据和患者数据进入另一个临时表,该临时表提供了许多联合查询。我想我可以在创建动态列的查询中硬编码列名。我试图了解您在做什么,您能为tmpDX提供模式吗?看起来您在这里并不真正需要动态SQL。您可以在SELECT中编写一个包含35个子查询的查询,以获取列的数据。然后,可以将没有数据的列设置为null,或者根据需要控制输出。