1
Sno ECTCodeDescription  ECTHedisCodeTypeCode
1   Outpatient  CPT
2   Outpatient  RevCode
3   Nonacute inpatient  CPT
4   Nonacute inpatient  RevCode
5   ED  CPT
6   ED  RevCode
7   Acute inpatient CPT
8   Acute inpatient RevCode

ここで私はこのような結果を得ており、私のクエリは

SELECT 
    DISTINCT Sno = ROW_NUMBER() OVER (
            ORDER BY ECTCodeDescription DESC
            ),
    EC.ECTCodeDescription,
    CEC.ECTHedisCodeTypeCode
FROM CodeSetHEDIS_ECTCode EC
INNER JOIN CodeSetECTHedisCodeType CEC
    ON EC.ECTHedisCodeTypeID = CEC.ECTHedisCodeTypeID
WHERE ECTHedisTableID = 29 
GROUP BY ECTCodeDescription,
CEC.ECTHedisCodeTypeCode

このような出力を取得するにはどうすればよいですか:

Sno CODEName            CODEID
1   Outpatient          NULL
2   CPT                 1
3   RevCode             1   
4   Nonacute            NULL    
5   CPT                 4
6   RevCode             4
7   ED                  NULL
8   CPT                 7
9   RevCode             7
10  Acute inpatient     NULL    
11  CPT                 10
12  RevCode             10

外来患者 ID = 1 が CPT = 1 に対して来て、Revcode = 1 および Nonacute ID = 4 が CPT = 4 に対して来て、Revcode = 4 になったことを確認できます。

道を教えて

4

1 に答える 1

0

テーブル構造とデータがThis Exampleのようなものであると仮定すると、新しいクエリは次のようになります。

;WITH CTE_distinct AS 
(
    SELECT ECTCodeDescription FROM CodeSetHEDIS_ECTCode
    GROUP BY ECTCodeDescription
)
, CTE_all AS 
(
    SELECT ECTCodeDescription AS CodeName, 0 AS CodeLevel, ECTCodeDescription AS MainCode  
    FROM CTE_distinct d
    UNION ALL
    SELECT t.ECTHedisCodeTypeCode AS CodeName, 1 AS CodeLevel, c.ECTCodeDescription AS MainCode
    FROM CTE_distinct d
    INNER JOIN dbo.CodeSetHEDIS_ECTCode c ON d.ECTCodeDescription = c.ECTCodeDescription
    INNER JOIN dbo.CodeSetECTHedisCodeType t ON c.ECTHedisCodeTypeID = t.ECTHedisCodeTypeID
)
,CTE_Numbers AS 
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY MainCode DESC, CodeLevel) AS Sno
        , *
    FROM CTE_all
)
SELECT sno, CodeName, NULL AS COdeID FROM CTE_Numbers 
WHERE CodeLevel = 0
UNION
SELECT n2.sno, n2.CodeName, n1.sno AS CodeID FROM CTE_Numbers n1
inner JOIN CTE_Numbers n2 ON n1.MainCode = n2.MainCode AND n1.CodeLevel = 0 AND n2.CodeLevel = 1
ORDER BY Sno

SQLFiddle デモ

基本的に、CodeID NULL を持つものと、番号付けのためにそれらをマージしないものを別々に取得します。最後に、それらを分離して再度マージし、CodeID 列に正しい値を取得します。

この最後の部分は、ユニオンの代わりにサブクエリでも実行できました。

SELECT sno, CodeName
    , CASE WHEN CodeLevel = 0 THEN  NULL 
           ELSE (SELECT sno FROM CTE_Numbers c2 WHERE c2.MainCode = c1.MainCode AND c2.CodeLevel = 0) 
    END AS CodeID
FROM CTE_Numbers c1
ORDER BY Sno

SQLFiddle デモ

于 2013-05-24T11:31:55.367 に答える