2

私は T-SQL の専門家ではないので、医療スタッフのスーパーバイザーによるインフルエンザワクチン、結核検査、人工呼吸器検査の遵守率を見つけようとしています。各従業員には、従業員情報にリンクされた上司の名前があります。以下のコードは正常に動作し、上記のテストの % が表示されます。問題は、ID、名前、部門をスーパーバイザーごとに取得し、コンプライアンスの割合を取得したいことです。

予想される出力は次のようになります。

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

select and group by に ID、NAME、および Dept を追加すると、SUM(1) は 1 または 0 になるため、すべてのスーパーバイザーで 100% または 0% になります。

これに関するヘルプは本当に感謝しています。御時間ありがとうございます。

4

1 に答える 1

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

非表示のスーパーバイザー列を追加して、従業員をスーパーバイザーの下に収めることができるようにしますが、そのフィールドは空白のままにします(これを追加して、外部クエリのユースケースを使用することもできません。どちらが速いかわかりません)。どうやら私たちはケースで試してみる必要があります

于 2013-03-04T00:45:17.990 に答える