Следующий запрос sql включает пустые строки.
select
mbz.mill,
sm.sugar_mill_order,
fhi.hczname as ZONE,
sd.name as STATION,
di.descrip,
di.unit,
wd.record_year,
to_char(sysdate, 'YYYY') as year,
to_char(sysdate,'WW') as week,
sd.station_num,
round(nvl(wd.dvalue,null), 1) as Station_Reading,
round(avg(nvl(wd.dvalue,null))
over(partition by mbz.mill, fhi.hczname, wd.dcode, wd.record_year),
1) as Zone_Average,
round(avg(nvl(wd.dvalue,null)) over(partition by mbz.mill), 1) as Mill_Average,
--round(avg(nvl(wd.dvalue,0))over(partition by mbz.mill),2) AS Average_For_Report,
(case when wd.dvalue is not null
then round(avg(nvl(wd.dvalue,0))over (partition by mbz.mill order by sm.sugar_mill_order, wd.dvalue asc),2)
end) as Average_for_report,
round(avg(msa.dvalue) over(partition by mbz.mill),1) AS LTM
from mill_by_zone mbz
join sugar_mills sm
on sm.sugar_mill_name = mbz.mill
join zone_by_station zbs
on zbs.zone = mbz.zone
join fca_hcz_info fhi
on fhi.hcz = zbs.zone
join station_details sd
on sd.station_num = zbs.station
left join
weekly_data wd
on wd.station_num = sd.station_num and
wd.record_year = 2019 and
wd.dcode = 1 and
wd.record_week = 19 and wd.dcode = 1 and wd.dvalue is not null and wd.record_year is not null
left join data_items di
on (wd.dcode = di.code_num )
left join msa_ltm_data msa
on( msa.record_mth = to_char(wd.last_update_date,'MM') and msa.dcode = wd.dcode and msa.mill_num = sm.sugar_mill_number and msa.dcode = di.code_num)
order by sm.sugar_mill_order, wd.dvalue
Всего 1 ответ
Когда агрегатные функции применяются к нулевым значениям, они возвращают строки, потому что нулевые значения не могут быть агрегированы. Решение этой проблемы заключается в том, чтобы либо применить Имеющий в конце, чтобы удалить записи, либо применить статистические функции интеллектуальным способом для агрегирования нулевых значений.
Например:
Select
Max(columnName) as ColumnNameAlis
from
tablename
where
tablename.Id = somevaluehere
Having
Max(columnName) is not null
ИЛИ ЖЕ
Select
Max(nvl(columnName, 0)) as ColumnNameAlis
from
tablename
where
tablename.Id = somevaluehere
Это основная идея, надеюсь, это поможет.