2

我不是T-SQL的專家,因此我在這裏試着找到醫務人員的主管爲流感疫苗,結核病測試和測試人員測試的合規性。每個員工都有一個與其員工信息相關的主管人員姓名。下面的代碼工作正常,它給了我上面的測試%。問題是我想要獲得主管的ID,姓名和部門以及合規率。使用T-SQL查找百分比合規性

預期輸出是這樣的:

Supervisor  ID  NAME  Dept  %Flu  %TB %FIT 
Elaine Jong         98% 100%  52% 
       001  MARY SURGERY  
       002  SUSAN SURGERY 
James Ande         100%  98%  78% 
       267  JIM INPATIENT 
       789  SAM INPATIENT 

Current OUTPUT 
       %Flu  %TB %FIT 
Elaine Jong  98% 100%  52% 
James Ande  100%  98%  78% 

和查詢:

SELECT E.FLDSUPRNAME AS Supervisor, 

1.0*SUM(
    CASE WHEN I.FLDDATE IS NULL 
      THEN 0 ELSE 1 
    END)/SUM(1) AS Percent_Flu_Compliant, 

1.0*SUM(
    CASE WHEN F.FLDDATE IS NULL OR (F.FLDDATE+365) < GETDATE() 
     THEN 0 ELSE 1 
    END)/SUM(1) 
AS Percent_Fit_Compliant, 

1.0*SUM(
    CASE WHEN PPDx.FLDDATEDUE IS NULL 
       AND TBSSx.FLDDATEDUE IS NULL 
       AND CDUEx.FLDDATEDUE IS NULL 
     THEN 1 ELSE 0 
    END) /SUM(1) AS Percent_TB_Compliant 

FROM EMPLOYEE E 

LEFT OUTER JOIN DEPT D 
ON D.FLDCODE= E.FLDDEPT 



LEFT OUTER JOIN IMMUNE I ON I.FLDEMPLOYEE = E.FLDREC_NUM AND I.FLDTYPE IN ('109', '111') 
AND I.FLDDATE = (SELECT MAX(FLDDATE) FROM IMMUNE I2 WHERE E.FLDREC_NUM = I2.FLDEMPLOYEE 
AND I2.FLDTYPE IN ('109','111')) AND I.FLDDATE >= @Flu_Date AND I.FLDDATE <= GETDATE() 


LEFT OUTER JOIN FITTEST F ON E.FLDREC_NUM = F.FLDEMPLOYEE 
AND F.FLDDATE = (SELECT MAX(FLDDATE) FROM FITTEST F2 WHERE E.FLDREC_NUM = F2.FLDEMPLOYEE) 

LEFT OUTER JOIN REQEXAM PPDx 
ON PPDx.FLDEMPLOYEE = E.FLDREC_NUM 
AND PPDx.FLDPHYSICAL = '110' AND 
PPDx.FLDDATEDUE <= getdate() 

LEFT OUTER JOIN REQEXAM PPDL 
ON PPDL.FLDEMPLOYEE = E.FLDREC_NUM 
AND PPDL.FLDPHYSICAL = '110' 

LEFT OUTER JOIN REQEXAM TBSSx 
ON TBSSx.FLDEMPLOYEE = E.FLDREC_NUM 
AND TBSSx.FLDPHYSICAL = 'TBSS' AND 
TBSSx.FLDDATEDUE <= getdate() 

LEFT OUTER JOIN REQEXAM TBSSL 
ON TBSSL.FLDEMPLOYEE = E.FLDREC_NUM 
AND TBSSL.FLDPHYSICAL = 'TBSS' 


LEFT OUTER JOIN REQEXAM CDUEx 
ON CDUEx.FLDEMPLOYEE = E.FLDREC_NUM 
AND CDUEx.FLDPHYSICAL = '109' AND 
CDUEx.FLDDATEDUE <= getdate() 

LEFT OUTER JOIN EMP S 
ON S.FLDREC_NUM = E.FLDREC_NUM 

WHERE E.FLDCOMP = @company 
    AND E.FLDSTATUS = 'A' 
    AND E.FLDSUPRNAME <> ' ' 
    AND E.FLDID <> ' ' 

GROUP BY E.FLDSUPRNAME 

ORDER BY E.FLDSUPRNAME 

如果我通過,SUM添加ID,NAME和DEPT上選擇和組(1)會變爲1或0,所以我會爲所有主管獲得100%或0%。

對此的任何幫助真的很感激。 感謝您的時間。

+0

我已經重新格式化了您的查詢,但我仍然有困難閱讀它。你能否簡化樣本 - 也許你可以創建一些CTE或臨時表來保存中間結果,只考慮最後一步?這也有助於您的調試。 – 2013-03-03 21:55:44

回答

0

使用UNION,添加空白列到第一個查詢和刪除訂單:

SELECT (CASE WHEN ID IS NULL THEN Supervisor ELSE '' END) ,ID, name,dept,Percent_Flu_Compliant,Percent_TB_Compliant,Percent_Fit_Compliant FROM 
(
SELECT E.FLDSUPRNAME AS Supervisor, NULL as ID, NULL as name, NULL as dept 
(...) 
GROUP BY hiddensupervisor, Supervisor, ID, name, dept 
UNION ALL 
SELECT E.FLDSUPRNAME Supervisor, E.id, E.name, E.dept, NULL as Percent_Flu_Compliant, NULL as Percent_TB_Compliant, NULL asPercent_Fit_Compliant 
FROM Employee 
) as q 
ORDER BY supervisor, (CASE WHEN ID IS NULL THEN 1 ELSE 0 END),ID 

我們添加了隱藏主管列可以他們的主管下,以適應員工,但離開該領域的空白那裏(我們也無法在外部查詢中添加它並使用大小寫,不知道哪一個會更快)。顯然我們必須嘗試使用​​案例

+0

當我嘗試所有工會我語法錯誤。請參閱上面的代碼。 – Anu 2013-03-04 19:07:01

+0

現在我收到這樣的錯誤:「ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中無效,除非TOP或FOR XML也被指定」 – Anu 2013-03-04 20:24:05

+0

@Anu我想我應該檢查它不是相信所有的東西都能像pg一樣工作。如果仍然有問題,我要求提供示例表的sqlfiddle。 – 2013-03-04 20:46:52