2014-06-23 32 views
0

我有一個查詢與查詢的主要問題

SELECT 
    ZEML.ICC_CODE AS ICC_CODE 
,SUM(CS.TOT_HOURS) AS TOT_HOURS 
,SUM(CS.NUM_INCIDENT_ALL) AS NUM_INCIDENTS 
,(VALUE(FLOAT(SUM(CS.NUM_INCIDENT_ALL)) * 200000/SUM(TOT_HOURS) 
,0)) AS INC_RATE 

FROM TR.CLAIMS_SUMM CS 

INNER JOIN TR.LOCATION_MASTER LM 
    ON LM.LOCATION = CS.LOCATION 
    AND CS.LOCATION < '900' 

LEFT JOIN TR.LOCATION_ASSIGNMENTS DISTRICT 
    ON DISTRICT.LOCATION = LM.LOCATION 
    AND DISTRICT.ASSIGNMENT_TYPE = 'District' 

LEFT JOIN TR.LOCATION_ASSIGNMENTS TERRITORY 
    ON TERRITORY.LOCATION = LM.LOCATION 
    AND TERRITORY.ASSIGNMENT_TYPE = 'Territory' 

LEFT JOIN TR.EMPL_CLAIMS ZEML 
    ON CS.LOCATION = ZEML.LOCATION 
    AND ZEML.TYPE = 'WC' 
    AND ZEML.STATUS <> 'V' 
    AND ZEML.CLAIM_ACTION NOT IN ('D','F','I','H') 

WHERE CS.DW_DATE BETWEEN '01/01/2014' 
    AND '05/31/2014' 
    AND (MONTH(ZEML.DATE_OF_INCIDENT) = MONTH(CS.DW_DATE) 
    AND YEAR(ZEML.DATE_OF_INCIDENT) = YEAR(CS.DW_DATE)) 

GROUP BY ZEML.ICC_CODE 

UNION 

SELECT 
'OTHER' AS ICC_CODE 
, 0 AS TOT_HOURS 
, 0 AS NUM_INCIDENTS 
, 0 AS INC_RATE 

FROM SYSIBM.SYSDUMMY1 

WHERE 1 = 1 

ORDER BY 1 

在我的工會,我做了其他的我想選擇從tr.empl_claims表一切,從工會存儲在其他因爲這個是我有許多其他國際刑事法院的代碼沒有事件在他們身上,我根據所有的數據計算我們的事故率和小時數,但我現在的查詢只是選擇當前有事故正在拋出我的計算。

+0

你正在使用哪些DBMS? – TheNorthWes

+0

看起來像'DB2'數據庫給我。 – Rahul

回答

0

從你使用FROM SYSIBM.SYSDUMMY1我相信你使用的是DB2數據庫。如果是的話,你可以使用CTE(公共表表達式),以達到預期的效果一樣

WITH cte1 AS 
(
SELECT 
    ZEML.ICC_CODE AS ICC_CODE 
,SUM(CS.TOT_HOURS) AS TOT_HOURS 
,SUM(CS.NUM_INCIDENT_ALL) AS NUM_INCIDENTS 
,(VALUE(FLOAT(SUM(CS.NUM_INCIDENT_ALL)) * 200000/SUM(TOT_HOURS) 
,0)) AS INC_RATE 

FROM TR.CLAIMS_SUMM CS 

... <rest of the code> ... 
) 

select * from cte1 

UNION ALL 

SELECT 
ICC_CODE 
, 0 AS TOT_HOURS 
, 0 AS NUM_INCIDENTS 
, 0 AS INC_RATE 
FROM TR.EMPL_CLAIMS 
WHERE ICC_CODE NOT IN 
(
    SELECT distinct ICC_CODE 
    FROM cte1 
) 
ORDER BY 1 

旁註:你正在參加同一個表LOCATION_ASSIGNMENTS兩次(如下圖),這是沒有必要的。

LEFT JOIN TR.LOCATION_ASSIGNMENTS DISTRICT 
    ON DISTRICT.LOCATION = LM.LOCATION 
    AND DISTRICT.ASSIGNMENT_TYPE = 'District' 

LEFT JOIN TR.LOCATION_ASSIGNMENTS TERRITORY 
    ON TERRITORY.LOCATION = LM.LOCATION 
    AND TERRITORY.ASSIGNMENT_TYPE = 'Territory' 

這可以轉化爲下面使用IN操作者

LEFT JOIN TR.LOCATION_ASSIGNMENTS DISTRICT 
    ON DISTRICT.LOCATION = LM.LOCATION 
    AND DISTRICT.ASSIGNMENT_TYPE IN ('District', 'Territory') 

查看在DB2 Here更多關於公用表中的表達。 希望這有助於。

+0

如果點擊投票按鈕下方的檢查按鈕幫助,請不要忘記接受答案。 – Rahul