查询的主要问题

时间:2014-06-23 16:32:55

标签: sql

我有一个查询

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表中选择其他所有内容并将其存储在另一个工会中,因为这是我有许多其他ICC代码而没有事件发生在我们身上根据所有数据计算我们的事件发生率和时间,但我现在的查询只是选择那些正在发生事故的计算器。

1 个答案:

答案 0 :(得分: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 

SideNote:您正在加入同一个表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中查看有关公用表表达式的更多信息。 希望这会有所帮助。