我有一个查询,它记录了2018年最后一次记录的事件和记录的事件总数。
在我的查询中,我必须将2018年应用于其中一个列。这是我的代码,让每个人都更容易理解:
select 1 as SortId, 'SouthEast' As "Region", NVL(COUNT(*),0) As "Recordable Events YTD"
from Table_name
WHERE
IA_TYPE_TEXT IN('con_a','con_b','con_c')
AND
IA_PLANT IN('location_a','location_b','location_c')
AND
to_char(IA_DATE,'YYYY') = '2018'
这段代码将给我2018年东南部的可记录事件,结果如下:
SORTID Region Recordable Events YTD
---------- --------- ---------------------
1 SouthEast 0
这是我的第二个查询,显示东南地区的最后一个事件
Select To_CHAR(TRUNC(max(IA_Date)),'MM/DD/YYYY') As "Incident Date"
from DOT.IA_LOG where IA_TYPE_TEXT IN('con_a','con_b','con_c')
AND
IA_PLANT IN('location_a','location_b','location_c')
结果是:
Incident Date
-------------
12/18/2017
我试图在一个结果中显示所有数据,但是当我尝试将第二个select语句添加到第一个时,它给出了我最后一个事件日期的空结果,因为2018条件适用于它这里是我的组合查询和结果。
select 1 as SortId, 'SouthEast' As "Region", NVL(COUNT(*),0) As "Recordable Events YTD",
To_CHAR(TRUNC(max(IA_Date)),'MM/DD/YYYY') As "Last Recordable Event"
from Table_name
WHERE
IA_TYPE_TEXT IN('con_a','con_b','con_c')
AND
IA_PLANT IN('location_a','location_b','location_c')
AND
to_char(IA_DATE,'YYYY') = '2018'
SORTID Region Recordable Events YTD Last Recordable Event
---------- --------- --------------------- ---------------------
1 SouthEast 0
如何将条件应用于其中一列?最简单的方法是什么?
请改用cte(common table expression)。希望这可以帮助。谢谢。
with tmp as (select 1 as SortId,
'SouthEast' As rgn,
NVL(COUNT(*),0) As YTD
from Table_name
WHERE IA_TYPE_TEXT IN('con_a','con_b','con_c')
AND IA_PLANT IN('location_a','location_b','location_c')
AND to_char(IA_DATE,'YYYY') = '2018')
select tmp.SortId,
rgn as "Region",
YTD as "Recordable Events YTD",
To_CHAR(TRUNC(max(IA_Date)),'MM/DD/YYYY') As "Incident Date"
from DOT.IA_LOG, tmp
where IA_TYPE_TEXT IN('con_a','con_b','con_c')
AND IA_PLANT IN('location_a','location_b','location_c')
group by sortid,rgn,ytd
Result:
SortId Region Recordable Events YTD Incident Date
1 SouthEast 0 12/18/2017
您可以使用条件计数,在count函数调用中使用case表达式,即:
COUNT(CASE WHEN to_char(IA_DATE,'YYYY') = '2018' then IA_DATE END)
而且没有全年的整体过滤器;原位:
select 1 as SortId,
'SouthEast' As "Region",
NVL(COUNT(CASE WHEN to_char(IA_DATE,'YYYY') = '2018' then IA_DATE END),0)
As "Recordable Events YTD",
To_CHAR(TRUNC(max(IA_Date)),'MM/DD/YYYY') As "Last Recordable Event" from IA_LOG
WHERE
IA_TYPE_TEXT IN('con_a','con_b','con_c')
AND
IA_PLANT IN('location_a','location_b','location_c')
/
count函数只计算非空值;如果不满足条件,则case表达式的结果为null,因此不计算这些行。
使用虚拟数据可以得到您在问题中显示的相同结果,这会得到:
SORTID Region Recordable Events YTD Last Recordable Event
---------- --------- --------------------- ---------------------
1 SouthEast 0 12/18/2017
不直接相关,但我个人更喜欢使用extract()
来比较部分日期; count()
不能返回null因此不需要nvl()
;因为你的格式模型不包括时间,所以也不需要trunc()
。所以你可以略微简化为:
select 1 as sortid,
'SouthEast' as "Region",
count(case when extract(year from ia_date) = 2018 then ia_date end)
as "Recordable Events YTD",
to_char(max(ia_date), 'MM/DD/YYYY') as "Last Recordable Event"
from ia_log
where ia_type_text in('con_a', 'con_b', 'con_c')
and ia_plant in('location_a', 'location_b', 'location_c')
得到相同的结果。我也避免引用标识符,但可能会直接用于显示。