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