2014-04-01 62 views
0

我有兩個表中的數據,我加入。表A看起來是這樣的:優化多查詢代碼SQL Server 2008 R2

VISIT ID | ADM_DATE | ... 
12345678 | 1800-01-01 | ... 
... 

表B看起來是這樣的:

VISIT ID | CLASFPRIO | CLASFCD | CLASFTYPE 
12345678 | 01  | ###.## | DF 
12345678 | 02  | ###.## | DF 
12345678 | 03  | ###.## | DF 

我想實現的是,像這樣的輸出:

A.VISIT ID | B.CLASFCD_1 | B.CLASFCD_2 | B.CLASFCD_2 
12345678 | ###.##  | ###.##  | ###.## 
... 

表A中的列其中我在where子句中設置了條件,表B也是如此。下面是我到目前爲止所做的工作,它的工作原理,它只是很多代碼:

DECLARE @SD DATETIME; 
DECLARE @ED DATETIME; 
DECLARE @CP_1 INT; 
DECLARE @CP_2 INT; 
DECLARE @CP_3 INT; 
DECLARE @SCT VARCHAR(10); 

SET @SD = '2014-01-01'; 
SET @ED = '2014-02-01'; 
SET @CP_1 = 1; 
SET @CP_2 = 2; 
SET @CP_3 = 3; 
SET @SCT = 'DF'; 


DECLARE @ICD9_1 TABLE (
PtNo_Num VARCHAR(20) 
, ICD_1 VARCHAR(10) 
) 

INSERT INTO @ICD9_1 
SELECT B.PtNo_Num 
, B.CLASFCD_1 

FROM (
SELECT DISTINCT PtNo_Num, 
ClasfCd AS CLASFCD_1 

FROM smsdss.BMH_PLM_PtAcct_Clasf_Dx_V 

WHERE ClasfPrio = @CP_1 
AND SortClasfType = @SCT 
) B 

--SELECT * FROM @ICD9_1 

----------------------------------------------------------------------- 
DECLARE @ICD9_2 TABLE (
PtNo_Num VARCHAR(20) 
, ICD_2 VARCHAR(10) 
) 

INSERT INTO @ICD9_2 
SELECT C.PtNo_Num 
, C.CLASFCD_2 

FROM (
SELECT DISTINCT PtNo_Num, 
ClasfCd AS CLASFCD_2 

FROM smsdss.BMH_PLM_PtAcct_Clasf_Dx_V 

WHERE ClasfPrio = @CP_2 
AND SortClasfType = @SCT 
) C 

--SELECT * FROM @ICD9_2 

----------------------------------------------------------------------- 
DECLARE @ICD9_3 TABLE (
PtNo_Num VARCHAR(20) 
, ICD_3 VARCHAR(10) 
) 

INSERT INTO @ICD9_3 
SELECT D.PtNo_Num 
, D.CLASFCD_3 

FROM (
SELECT DISTINCT PtNo_Num, 
ClasfCd AS CLASFCD_3 

FROM smsdss.BMH_PLM_PtAcct_Clasf_Dx_V 

WHERE ClasfPrio = @CP_3 
AND SortClasfType = @SCT 
) D 

--SELECT * FROM @ICD9_3 

----------------------------------------------------------------------- 
DECLARE @ICD9F TABLE(
PTNO_NUM VARCHAR(20) 
, ICD9_1 VARCHAR(10) 
, ICD9_2 VARCHAR(10) 
, ICD9_3 VARCHAR(10) 
) 

INSERT INTO @ICD9F 
SELECT 
E.PTNO_NUM 
, E.ICD9_1 
, E.ICD9_2 
, E.ICD9_3 

FROM (

SELECT PV.PtNo_Num 
, ICD9_1.ICD_1 AS ICD9_1 
, ICD9_2.ICD_2 AS ICD9_2 
, ICD9_3.ICD_3 AS ICD9_3 

FROM smsdss.BMH_PLM_PtAcct_V PV 
JOIN @ICD9_1 ICD9_1 
ON PV.PtNo_Num = ICD9_1.PtNo_Num 
JOIN @ICD9_2 ICD9_2 
ON PV.PtNo_Num = ICD9_2.PtNo_Num 
JOIN @ICD9_3 ICD9_3 
ON PV.PtNo_Num = ICD9_3.PtNo_Num 

WHERE PV.Adm_Date >= @SD 
AND PV.Adm_Date < @ED 
AND PV.Plm_Pt_Acct_Type = 'I' 
AND PV.PtNo_Num < '20000000' 
) E 

SELECT * FROM @ICD9F 

雖然這確實起作用,但它有很多代碼,它確實讓人有點困惑,所以我將問題改爲優化查詢。

更新:CLASFCD可以是字母和數字同時更新代碼來什麼,我現在的建議BY @METAPHOR

WORKING謝謝

回答

1

試試這個(轉述):

select 
    VisitID, 
    sum(case when classfprio = '01' then classfcd else 0 end) as ClassFCD1, 
    sum(case when classfprio = '02' then classfcd else 0 end) as ClassFCD2, 
    sum(case when classfprio = '03' then classfcd else 0 end) as ClassFCD3 
from TableA a 
join TableB b on b.VisitID = a.VisitID 
group by VisitID, ClassFPrio 
+0

會在早上試試,謝謝,有趣的方式來思考一下吧。 –

+0

這不起作用,我沒有意識到ClasfCD可以是字母數字,我會努力爭取努力並解決我的問題。 –

+0

是的,這是一個交叉表的要求,該列需要是一個聚合。 – Metaphor