1

DX一時テーブルからデータを取得し、そのデータを一時POAテーブルに挿入する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 列すべてを作成する方法について何か考えはありますか? それらがnullかどうかは気にしません。メインの患者クエリにこれらのプレースホルダーが必要なだけで、返される列の数が毎月異なることは役に立ちません。

4

2 に答える 2

0

これが動的 SQL で機能するには、行/列が 0 回以上存在する必要があります。患者が 1 人でも複数でも構いません。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

これにより、POA フラグを取得するための 35DXCodes のすべての可能性が広がります。

于 2014-11-06T18:34:58.823 に答える