Sql server 具有可变列的动态轴心

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

我有一个POA代码动态透视,它从DX临时表中提取数据并将数据插入临时POA表。 我遇到的问题是,最多可以返回35个不同的列。根据月份的不同,可能有15列POA1…POA15,也可能有全部35列POA1…POA35。我将这个动态透视临时表连接到另一个患者表上。我的问题是,即使temp 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的临时表,并从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,或者根据需要控制输出。