SQL исключает нулевые значения в агрегатных функциях

Следующий запрос 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

Это основная идея, надеюсь, это поможет.


Есть идеи?

10000