2017-07-19 13 views
0

Mit Oracle SQL, in der folgenden Datei, möchte ich untersuchen, wenn Spalte B = 'N', ich möchte, dass es die gleiche ID in Spalte A finden und vergleichen, was die Zeilen in Spalte C sind für diese ID. wenn sie gleich sind, dann 'Y', wenn nicht, dann 'N' sonst Null.Oracle SQL - Spalten vergleichen

A B C  D 
001 Y Pizza Pepperoni 
002 Y Pizza Pepperoni 
003 Y Pizza Pepperoni 
003 N Pizza Sausage 
004 Y Pizza Pepperoni 
005 Y Pizza Pepperoni 
005 N Pizza Sausage 
005 N Hamburger Cheese 

Idealerweise würde ich es laufen die ID (Spalte A) und die Ergebnisse der Fall-Anweisung zurück, so dass es so aussieht ...

A  B 
001 (Null) 
002 (Null) 
003 (Null) 
003 Y 
004 (Null) 
005 (Null) 
005 Y 
005 N 

Kann mir jemand das, was Code würdest du das machen?

+0

Können Sie Ihr Beispiel richtig formatieren? – fhossfel

+0

Ich verbesserte die Formatierung. Jemand muss die Überprüfung überprüfen und akzeptieren. –

+0

Warum vorletzter ist Y in der Ausgabe. Es sollte N sein, denn für die ID 005 gibt es sowohl Pizza als auch Hamburger –

Antwort

0

Wie die anderen Kommentare angeben, sollte die zweitletzte Zeile bei den angegebenen Regeln den Wert 'N' in B haben. Das folgende Skript gibt das korrekte Ergebnis gemäß den angegebenen Regeln zurück, stimmt jedoch nicht mit der Beispielausgabe überein:

/* test data */ 
select '001' as a, 'Y' as b, 'Pizza' as c,  'Pepperoni' as d into testtable union all 
select '002' as a, 'Y' as b, 'Pizza' as c,  'Pepperoni' as d union all 
select '003' as a, 'Y' as b, 'Pizza' as c,  'Pepperoni' as d union all 
select '003' as a, 'N' as b, 'Pizza' as c,  'Sausage' as d union all 
select '004' as a, 'Y' as b, 'Pizza' as c,  'Pepperoni' as d union all 
select '005' as a, 'Y' as b, 'Pizza' as c,  'Pepperoni' as d union all 
select '005' as a, 'N' as b, 'Pizza' as c,  'Sausage' as d union all 
select '005' as a, 'N' as b, 'Hamburger' as c, 'Cheese' as d 
go 

/* script */ 
select 
    a 
    ,case when b = 'Y' then null else 
    case when c = lag(c, 1) over (partition by a order by c desc, d) then 'Y' else 'N' end 
    end as b 

from testtable 
go 


/* Results...*/ 

|-----+------| 
| A | B | 
|-----+------| 
| 001 | NULL | 
| 002 | NULL | 
| 003 | NULL | 
| 003 | Y | 
| 004 | NULL | 
| 005 | NULL | 
| 005 | Y | 
| 005 | N | 
|-----+------| 
+0

Ich schätze Ihre Hilfe. Ich weiß jedoch nicht, ob ich es richtig erklärt habe. Die vorletzte Zeile sollte ein 'Y' als Ergebnis haben, da sie in Spalte c denselben Wert hat. Ich hätte Spalte D in meinem Beispiel einfach ausschließen sollen, weil das egal ist. – dbwhite64

+0

Okay, versuch das neue Skript. –