2015-03-31 65 views
0

好的 - 我有一個包含聲明ID和過程代碼組合的表 - 我需要做的是隔離唯一存在以8開頭的過程代碼的claimIDs在下文中,我需要能夠與在ClaimID的LIKE「8%」的代碼存在claimIDs搶只有那些記錄 - 沒有其他procedureCodes等 - 因此,只有2和3 ClaimID的從下面獲取具有匹配特定模式的連接列的行

claimID procedureCode 
    1  85025 
    1  97110 
    2  85025 
    2  80102 
    3  87112 
    3  81020 

我想如果存在以不同數字開頭的索賠記錄,則排除索賠ID。

+0

使用WHERE NOT EXISTS子句。 – 2015-03-31 16:53:27

+0

claimID其中所有procedureCode都以'8'開頭? – mxix 2015-03-31 16:53:51

+1

「1 85025」記錄呢? – 2015-03-31 16:54:00

回答

1

我們通過三個步驟來做到這一點。第一步是找到記錄失敗「沒有其他前導數字」的要求。第二步是找到滿足「必須從8開始」的記錄。第三步是將兩組數據匹配到一個exclusion join,以便我們從步驟2中取出該組並排除步驟1中的組:

我們還需要知道procedureCode列的數據類型。知道一點關於CPT codes,我期望char(5)或類似是最合適的選擇,這取決於你如何處理修飾符。如果這是你如何保存它,那麼這應該工作:

With BadClaims As (--Step 1 
    SELECT distinct ClaimID 
    FROM [Table] 
    WHERE procedureCode NOT LIKE '8%' 
), GoodClaims AS (--Step 2 
    SELECT distinct ClaimID 
    FROM [Table] 
    WHERE procedureCode LIKE '8%' 
) 
SELECT g.ClaimID --Step 3 
FROM GoodClaims g 
LEFT JOIN BadClaims b on b.ClaimID = g.ClaimID 
WHERE b.ClaimID IS NULL 

但是,您可能已經存儲了它作爲整數/數字字段。如果是這樣,這應該工作:

With BadClaims As (--Step 1 
    SELECT distinct ClaimID 
    FROM [Table] 
    WHERE procedureCode < 80000 or procedureCode >= 90000 
), GoodClaims AS (--Step 2 
    SELECT distinct ClaimID 
    FROM [Table] 
    WHERE procedureCode LIKE >= 80000 and procedureCode < 90000 
) 
SELECT g.ClaimID --Step 3 
FROM GoodClaims g 
LEFT JOIN BadClaims b on b.ClaimID = g.ClaimID 
WHERE b.ClaimID IS NULL 

這是一個長的形式,解釋這裏發生了什麼。您還可以簡化這些步驟製作成單個自聯接:

SELECT distinct t1.claimID 
FROM [Table] t1 
LEFT JOIN [Table] t2 ON t2.claimID = t1.ClaimID and t2.procecureCode NOT LIKE '8%' 
WHERE t1.procedureCode LIKE '8%' and t2.claimID IS NULL 
+0

他不希望claimID 1,只有那些只有以'8'開頭的procedureCodes。 ClaimID 1有一個以'9'開頭的procedureCode – mxix 2015-03-31 16:55:44

+0

好吧,我現在明白了。很快會更新。 – 2015-03-31 16:57:43

+0

可能想要在第二個代碼示例中編輯此行:Where ClaimID LIKE> = 80000和ClaimID <90000.我認爲您希望查看procedureCode而不是ClaimID。此外,如果procedureCode是一個數字,它可以簡單地作爲一個varchar CAST並與一個LIKE運算符一起使用。 – 2015-03-31 17:12:39

2
SELECT DISTINCT yt1.ClaimID 
    FROM YourTable yt1 
    WHERE yt1.procedureCode LIKE '8%' 
     AND NOT EXISTS (SELECT 1 
          FROM YourTable yt2 
          WHERE yt2.ClaimID = yt1.ClaimID 
           AND yt2.procedureCode NOT LIKE '8%');