2014-12-18 3 views
0

Следующий скрипт дает мне информацию о доставке. Но из-за плохой системы, установленной в течение нескольких лет, NAME1 (имя адреса) имеет несколько вариантов. Есть ли способ изменить NAME1, чтобы показать наиболее часто используемый NAME1, но сохранить всю информацию о других строках?oracle sql, изменить значение на наиболее распространенное значение

select ad.name1, 
     ad.town, 
     replace(ad.zip, ' ', '') zip, 
     ad.country, 
     (select sum(dp1.palette) 
      from oes_dpos dp1 
     where dp1.dheadnr = dh.dheadnr) count_pallet, 
     (select sum(dp2.delqty) 
      from oes_dpos dp2 
     where dp2.dheadnr = dh.dheadnr) del_units, 
     ((select sum(dp3.delqty) 
      from oes_dpos dp3 
      where dp3.dheadnr = dh.dheadnr) * sp.nrunits) del_discs 
    from oes_dhead dh, 
     oes_dpos dp, 
     oes_address ad, 
     oes_opos op, 
     SCM_PACKTYP sp 
where dh.actshpdate >= '01-DEC-2013' 
    and dh.actshpdate - 1 < '30-NOV-2014' 
    and dh.shpfromloc = 'W' 
    and ad.key = dh.delnr 
    and ad.adr = dh.deladr 
    and dp.dheadnr = dh.dheadnr 
    and op.ordnr = dp.ordnr 
    and op.posnr = dp.posnr 
    and op.packtyp = sp.packtyp 
    and upper(ad.name1) not like '%SONY%' 
    and replace(ad.zip, ' ', '') = 'CO77DW' 
+0

Используйте подзапрос с GROUP BY и найдите наиболее распространенный вариант! – jarlh

ответ

2

Да вам нужно подсчитать вхождения в NAME1

Изменить его следующим образом

select name1, count(name1) occurances, town, zip, country, count_palle,del_units,del_discs from ( 
select ad.name1, 
    ad.town, 
    replace(ad.zip, ' ', '') zip, 
    ad.country, 
    (select sum(dp1.palette) 
     from oes_dpos dp1 
    where dp1.dheadnr = dh.dheadnr) count_pallet, 
    (select sum(dp2.delqty) 
     from oes_dpos dp2 
    where dp2.dheadnr = dh.dheadnr) del_units, 
    ((select sum(dp3.delqty) 
     from oes_dpos dp3 
     where dp3.dheadnr = dh.dheadnr) * sp.nrunits) del_discs 


from oes_dhead dh, 
     oes_dpos dp, 
     oes_address ad, 
     oes_opos op, 
     SCM_PACKTYP sp 
where dh.actshpdate >= '01-DEC-2013' 
    and dh.actshpdate - 1 < '30-NOV-2014' 
    and dh.shpfromloc = 'W' 
    and ad.key = dh.delnr 
    and ad.adr = dh.deladr 
    and dp.dheadnr = dh.dheadnr 
    and op.ordnr = dp.ordnr 
    and op.posnr = dp.posnr 
    and op.packtyp = sp.packtyp 
    and upper(ad.name1) not like '%SONY%' 
    and replace(ad.zip, ' ', '') = 'CO77DW' 
    ) 
    group by name1, town, zip, country, count_palle,del_units,del_discs 

Помните я использую запрос как дополнительный запрос, так как я не знаю, как будет выглядеть ваш DDL.

Вы даже можете отсортировать результат по графу.

+0

Блестящий ... спасибо – SMORF

0

Самого простой был бы просто заменить ad.name1 с

(SELECT name1 FROM 
    (SELECT name1, COUNT(*) FROM oes_address GROUP BY name1 ORDER BY 2 DESC) 
    WHERE ROWNUM = 1 
) 

Это подсчитывает все вхождения имя1 во всей таблице, подсчитывает их и сортирует этот счет. Таким образом, наиболее распространенное имя1 находится в первой строке. Эта строка выбрана.

+0

Вам не нужно условие/ссылка на внешний/основной выбор? (Таким образом, все выбранные строки будут иметь один и тот же адрес/имя1.) – jarlh

+0

Привет, ссылка будет zip ... i.e найти наиболее распространенный NAME1, где ZIP - то же самое. – SMORF

+0

Тогда вы должны, вероятно, изменить свой вопрос, чтобы спросить именно это !!! «Самое распространенное имя1, где ZIP тот же» – Falco

0

Я думаю, что вы хотите что-то вроде этого:

with names as(
select 'street 1' name1 from dual 
union all 
select 'str 1' from dual 
union all 
select 'str. 1' from dual 
union all 
select 'street 1' from dual 
union all 
select 'str. 1' from dual 
union all 
select 'str. 1' from dual 
union all 
select 'street 1' from dual 
union all 
select 'str 1' from dual 
union all 
select 'street 1' from dual 
union all 
select 'street 1' from dual 
union all 
select 'str 1' from dual 
union all 
select 'str 1' from dual 
union all 
select 'street 1' from dual 
union all 
select 'str 1' from dual 
union all 
select 'str 1' from dual 
union all 
select 'street 1' from dual 
union all 
select 'str 1' from dual 
union all 
select 'str 1' from dual) 
select name1 
from(
select name1 
from names 
group by name1 
order by count(*) desc) 
where rownum=1 
Смежные вопросы