Ich habe diese folgende Tabelle

Dept----------  Sub_Dept----      Dept Type    
Sales.............Advertising........A    
Sales.............Marketing......... B    
Sales.............Analytics.......... C
Operations.....IT..................... C    
Operations.....Settlement........C

Und das Ergebnis sollte sein, wenn eine Abteilung einen Abteilungstyp als A hat, dann ändern Sie alle Datensätze dieser Abteilung in A, andernfalls behalten Sie sie bei

Dept----------  Sub_Dept----      Dept Type    
Sales.............Advertising........A   
Sales.............Marketing......... A    
Sales.............Analytics.......... A    
Operations.....IT..................... C    
Operations.....Settlement........C

Kann jemand einen Vorschlag dazu machen? Ich habe überlegt, GROUP BY zu verwenden, muss aber auch die Unterabteilung ausgeben

Danke vielmals

1
Jenny 17 Apr. 2018 im 18:09

5 Antworten

Beste Antwort

Verwenden Sie die folgende Abfrage

select a11.dept, a12.Sub_Dept, (case when a12.min_dep_type='A' then 'A' else a11.dep_type) as dep_type
from tab a11
JOIN (select dept, min(dep_type) min_dep_type from tab group by dept) a12
on a11.dept = a12.dept
0
GauravS 17 Apr. 2018 im 15:16

Ich würde tun:

update t
    set depttype = 'a'
    where exists (select 1 from t t2 where t2.dept = t.dept and t2.dept = 'a') and
          t.dept <> 'a';

Wenn Sie nur ein select möchten, gehen Sie wie folgt vor:

select t.*,
       (case when sum(case when depttype = 'a' then 1 else 0 end) over (partition by dept) > 1
             then 'a'
             else depttype
        end) as new_depttype
from t;
2
Gordon Linoff 17 Apr. 2018 im 15:22

Versuche dies:

update table
set depttype= case when dept in (select dept from table where depttype='a') then 'a' else depttype end 
0
Daniel Marcus 17 Apr. 2018 im 15:13

Das sollte funktionieren:

select a.dept, a.sub_dept, 
case when b.dept is not null then 'A' else dept_type end as dept_type
from aTable a
left join(
    select distinct Dept from aTable where dept_type = 'A'
) 
b on b.dept = a.dept
0
isaace 17 Apr. 2018 im 15:22

Mithilfe von Analysefunktionen können Sie überprüfen, ob der bestimmte Wert in der Gruppe vorhanden ist.

Versuchen Sie die folgende Abfrage:

SELECT t.Dept,
       t.Sub_Dept,
       NVL(MIN(CASE WHEN t.Dept_Type = 'A'
               THEN Dept_Type END) OVER (PARTITION BY t.Dept), t.Dept_Type) AS Dept_Type
  FROM table_1 t

Mit der Analysefunktion MIN () können Sie nach dem Wert von 'A' suchen (falls dieser innerhalb der Gruppe vorhanden ist). MIN funktioniert nur für Werte ungleich Null. Wenn Sie also kein 'A' in der Gruppe haben, ist das Ergebnis NULL.

Zu diesem Zeitpunkt können Sie mit NVL auswählen, ob der in der Gruppe gefundene Wert oder der tatsächliche dept_type der Zeile gedruckt werden soll.

0
Alex Zen 17 Apr. 2018 im 15:52