2013-04-01 20 views
0

我正在使用SQL Server 2008.我有三個不同的查詢,我想聯合在一起,但我不確定如何正確地去做,因爲查詢的結構是不同的。 我的第一個查詢創建了兩個表來插入記錄進行比較,其中返回訪問列的MAX。例如:如何正確加入三個不同的查詢

查詢:

SET ANSI_NULLS OFF 
GO 

-- VARIABLE DECLARATION 
DECLARE @STARTDATE DATETIME 
DECLARE @ENDDATE DATETIME 

-- VARIABLE INITIALIZATION 
SET @STARTDATE = '6/1/12'; 
SET @ENDDATE = '1/1/13'; 

--############################################################################################# 
-- TABLE DECLARATION WHICH WILL BE USED TO GET THE MAX ORDERED DATE       # 
--                       # 
DECLARE @T1 TABLE (ENCOUNTER VARCHAR(200), PT_NAME VARCHAR(500), MRN VARCHAR(200),   --# 
        LOS VARCHAR(200), PT_LOC VARCHAR(500), PT_DISPO VARCHAR(500),   --# 
        LAB_NAME VARCHAR(500), LAB_VALUE VARCHAR(40),LOWER_LIMIT VARCHAR(30), --# 
        UPPER_LIMIT VARCHAR(30), HISTORY VARCHAR(10), HAS_HISTORY VARCHAR(10), --# 
        AB_CODE VARCHAR(30), ORDER_ENTERED VARCHAR(500))       --# 
DECLARE @T2 TABLE (ENCOUNTER2 VARCHAR(200), PT_NAME2 VARCHAR(500), MRN2 VARCHAR(200),  --# 
        LOS2 VARCHAR(200), PT_LOC2 VARCHAR(500), PT_DISPO2 VARCHAR(500),   --# 
        LAB_NAME2 VARCHAR(500), LAB_VALUE2 VARCHAR(40),LOWER_LIMIT2 VARCHAR(30), --# 
        UPPER_LIMIT2 VARCHAR(30), HISTORY2 VARCHAR(10), HAS_HISTORY2 VARCHAR(10),--# 
        AB_CODE2 VARCHAR(30), ORDER_ENTERED2 VARCHAR(500))      --# 
--                       # 
--############################################################################################# 

--##  TABLE INSERTIONS  ## 
--########################################################################################### 
--## WHAT GETS PUT INTO TABLE 1 ## 
INSERT INTO @T1 
SELECT 
A.VisitIDCode, 
A.ClientDisplayName, 
A.IDCode, 
A.LOS, 
A.CurrentLocation, 
A.DischargeDisposition, 
A.ItemName, 
A.Value, 
A.ReferenceLowerLimit, 
A.ReferenceUpperLimit, 
A.IsHistory, 
A.HasHistory, 
A.AbnormalityCode, 
A.Entered 

FROM 
(
-- COLUMN SELECTION 
SELECT CV.VisitIDCode, CV.ClientDisplayName, CV.IDCode,DATEDIFF(DD,CV.ADMITDTM,CV.DISCHARGEDTM)AS 'LOS', 
CV.CurrentLocation, CV.DischargeDisposition, BO.ItemName, BO.Value, 
BO.ReferenceLowerLimit, BO.ReferenceUpperLimit, BO.IsHistory, BO.HasHistory, BO.AbnormalityCode, 
BO.Entered 

-- DB USED: SCM 
FROM CV3ClientVisit CV 
JOIN CV3BasicObservation BO 
ON CV.GUID = BO.ClientVisitGUID 

WHERE CV.AdmitDtm BETWEEN @STARTDATE AND @ENDDATE 
AND CV.TypeCode = 'INPATIENT' 
AND BO.Value IS NOT NULL 
AND (BO.ItemName LIKE '%SODIUM LEVEL%' 
OR BO.ITEMNAME LIKE '%HEMOG%') 
)A 

--##  TABLE INSERTIONS  ## 
--########################################################################################### 
--## WHAT GETS PUT INTO TABLE 2 ## 
INSERT INTO @T2 
SELECT 
B.VisitIDCode, 
B.ClientDisplayName, 
B.IDCode, 
B.LOS, 
B.CurrentLocation, 
B.DischargeDisposition, 
B.ItemName, 
B.Value, 
B.ReferenceLowerLimit, 
B.ReferenceUpperLimit, 
B.IsHistory, 
B.HasHistory, 
B.AbnormalityCode, 
B.Entered 

FROM 
(
-- COLUMN SELECTION 
SELECT CV.VisitIDCode, CV.ClientDisplayName, CV.IDCode,DATEDIFF(DD,CV.ADMITDTM,CV.DISCHARGEDTM) AS 'LOS', 
CV.CurrentLocation,CV.DischargeDisposition, BO.ItemName, BO.Value,BO.ReferenceLowerLimit, BO.ReferenceUpperLimit, 
BO.IsHistory, BO.HasHistory, BO.AbnormalityCode,BO.Entered 

-- DB USED: SCM 
FROM CV3ClientVisit CV 
JOIN CV3BasicObservation BO 
ON CV.GUID = BO.ClientVisitGUID 


WHERE CV.AdmitDtm BETWEEN @STARTDATE AND @ENDDATE 
AND CV.TypeCode = 'INPATIENT' 
AND BO.Value IS NOT NULL 
AND (BO.ItemName LIKE '%SODIUM LEVEL%' 
OR BO.ITEMNAME LIKE '%HEMOG%') 
)B 

--########################################################################################### 
--## HERE IS WHERE WE DO TABLE COMPARISONS ## 

SELECT 
DISTINCT T1.ENCOUNTER, 
T1.PT_NAME AS 'PT NAME', T1.MRN AS 'MRN', T1.LOS AS 'LOS', T1.PT_LOC AS 'PT LOC', 
T1.PT_DISPO AS 'PT DISPO', T2.LAB_NAME2 AS 'LAB NAME', T2.LAB_VALUE2, T2.LOWER_LIMIT2 AS 'LOWER LIMIT', 
T2.UPPER_LIMIT2 AS 'UPPER LIMIT', T2.AB_CODE2 AS 'AB CODE', T2.ORDER_ENTERED2 

FROM @T1 T1 
JOIN @T2 T2 
ON T1.MRN = T2.MRN2 

WHERE 
T1.ENCOUNTER = T2.ENCOUNTER2 
AND T1.ORDER_ENTERED < T2.ORDER_ENTERED2 
AND T2.ORDER_ENTERED2 = (
         SELECT MAX(TEMP.ORDER_ENTERED2) 
         FROM @T2 TEMP 
         WHERE T1.MRN = TEMP.MRN2 
         ) 

結果

CLIENT ID VISIT ID  ARRIVE DATE  VALUE  DATE VALUE ORDERED 
....................................................................... 
1  |  1  |  1/1/13  | 5  | 1/1/13 
1  |  1  |  1/1/13  | 6  | 1/2/13 <- returned row 

如果此查詢將訂購的13年1月2日的日期值返回的行。

第二個查詢計算了我在Client ID列中的客戶端在12個月的時間範圍內有多少次。所以對於它上面將返回類似 查詢2:

-- VARIABLE DECLARATION 
DECLARE @STARTDATE DATETIME 
DECLARE @ENDDATE DATETIME 

-- INITIALIZE VARIABLES 
SET @STARTDATE = '6/1/12'; 
SET @ENDDATE = '1/1/13'; 

-- COLUMN SELECTION 
SELECT DISTINCT CV.IDCode AS 'MRN', COUNT(CV.IDCODE) AS 'COUNT OF IP VISITS' 

FROM CV3ClientVisit CV 

WHERE CV.AdmitDtm BETWEEN @STARTDATE AND @ENDDATE 
AND CV.TypeCode LIKE '%INPATIENT' 
AND CV.VisitStatus IN(
'ADM', 
'DSC' 
) 
GROUP BY CV.IDCode 
ORDER BY COUNT(CV.IDCode) DESC 

結果:訪問 的 客戶端ID計數..................... .......... 1 | 2

第三和最終的查詢告訴我,他們有多少次做了,例如

查詢3:

Declare @procedures Table (MRN varchar(20), Patient varchar(80), VisitID varchar(20), Admit datetime, Disch datetime, SurgProc varchar(200), ProcDesc varchar(200)) 
insert into @procedures 


select cv.IDCode,cv.ClientDisplayName,cv.VisitIDCode,AdmitDtm,cv.DischargeDtm,ed.Description,ed.text from CV3ClientVisit cv 
left join cV3ClientEventDeclaration ed 
    on cv.GUID=ed.ClientVisitGUID 
     where ed.typecode = 'Surgery' 
     and cv.AdmitDtm > '6/30/12' and cv.AdmitDtm <='1/1/13' 
     and Status = 'Active' 

    select visitid, COUNT(visitid)as '#Surg Procs' from @procedures 
     group by visitid 

結果:

CLIENT ID  VISIT ID  ARRIVE DATE  DEPART DATE  COUNT OF PR VISITS 
............................................................................... 
1   | 1   | 1/1/13  | 1/3/13  | 3 

所以我的問題是,如何我是否正確JOIN所有這些查詢在一起,以獲得只有一個結果?有些時候客戶可能沒有針對其中一項查詢的結果。

我想最終的頭看起來像這樣:

CLIENT ID | CLIENT VISIT ID | CLIENT NAME | LOS | PT LOC | PT DISPO | LAB NAME | LAB VALUE | LOWER LIMIT | UPPER LIMIT | AB CODE | COUNT OF IP VISITS | COUNT OF PROCEDURES  

謝謝

+0

請出示你想怎麼最後(彙總)結果看起來像。只是頭部會很好。 –

+0

好的,對不起。 –

回答

1

確定。我會給你一個提示。

假設你有兩個SELECT類型的查詢。

第一個返回:Last Name, First Name, Date of Birth

回報:Last Name, First Name, Address, Occupation

你想要結果爲:Last Name, First Name, Occupation, Date of Birth, Address

你會做這樣的事情:

SELECT LastName, FirstName, NULL,  DOB, NULL FROM ... 
UNION 
SELECT LastName, FirstName, Occupation, NULL, Address FROM ... 
+0

感謝您的努力和指導,我將着手繪圖板並完成這項工作。 –