2016-09-20 5 views
0

My TableAbfrage eine Spalte, die nicht den gleichen Wert in einer anderen Spalte hat

ItemCode  ItemName  Total 
---------------------------------- 
A    name1   5 
A    name1   5 
A    name2   10 
B    name1   10 
B    name2   25 
B    name1   30 
C    name2   5 
C    name1   30 
C    name1   20 

ich will alle itemcodeA und B angezeigt werden, die nicht den gleichen Wert in der Spalte hat Total

Mein erwartet Ergebnis

ItemCode   ItemName   Total 
---------------------------------------- 
A     name1    5 
A     name1    5 
B     name2    25 
B     name1    30 

Ich habe diese Frage schon gestellt, aber diesmal ist meine Frage viel klarer als meine letzten Fragen Iton. Ich denke, 1 Lösung dafür ist ein Self Join, aber ich kann es nicht herausfinden. Jede Hilfe würde mir sehr viel bedeuten!

+1

Noch nicht so klar für mich: warum die Zeilen mit ItemCode = 'A' im erwarteten Ergebnis? Sie kommen aus vollkommen gleichen Reihen mit der gleichen Summe, während Sie sagen, "hat nicht den gleichen Wert in der Spalte Gesamt". Meinst du, dass du nur die Zeilen willst, für die keine Zeile eines anderen ItemCodes mit der gleichen Summe existiert? – Aleksej

+0

@Aleksej Hallo Aleksej danke, dass du mir wirklich geholfen hast. Alles, was ich will, ist, alle Itemnamen in Itemcode 'A' und 'B' zu bekommen, die nicht die gleiche 'Total' haben, aber wenn sie im selben Itemcode sind und die gleiche Summe haben, möchte ich, dass sie eingeschlossen werden. –

+0

Willst du nur für Paar A und B oder für jedes Paar wie (A, C) (B, C) etc. –

Antwort

1

Unter der Annahme, dass Sie die Zeilen benötigen, für die keine andere Zeile eines anderen itemCode mit dem gleichen Total existieren, und dass ItemCode Annahme ist nicht immer null, kann eine einfache Lösung dies:

with test(ItemCode, ItemName, Total) as 
(
    select 'A', 'name1', 5 from dual union all 
    select 'A', 'name1', 5 from dual union all 
    select 'A', 'name2', 10 from dual union all 
    select 'B', 'name1', 10 from dual union all 
    select 'B', 'name2', 25 from dual union all 
    select 'B', 'name1', 30 from dual union all 
    select 'C', 'name2', 5 from dual union all 
    select 'C', 'name1', 30 from dual union all 
    select 'C', 'name1', 20 from dual 
) 
select * 
from test t1 
where ItemCode in ('A', 'B') 
    and not exists (
        select 1 
        from test t2 
        where t1.total = t2.total 
        and t1.itemCode != t2.itemCode 
        and ItemCode in ('A', 'B') 
       ) 

Das folgende ist schneller, aber weniger lesbar:

select ItemCode, ItemName, Total 
from (
     select ItemCode, ItemName, Total, count(distinct ItemCode) over (partition by Total) as itemCount 
     from test 
     where ItemCode in ('A', 'B') 
    ) 
where itemCount = 1 
+0

Das hat tatsächlich funktioniert! Danke Mann @Aleksej 5 Daumen hoch! –

1

versuchen, diese Abfrage:

select i.* 
from my_table i 
where i.ItemCode in ('A','B') 
and (select count(*) from my_table t where t.ItemCode in ('A','B') 
and t.ItemCode != i.ItemCode and t.total = i.total) = 0 
1
SELECT A.* FROM (SELECT * FROM MYTABLE WHERE ITEMCODE='A')A 
     LEFT JOIN (SELECT * FROM MYTABLE WHERE ITEMCODE='B')B ON 
    A.TOTAL=B.TOTAL 
WHERE B.ITEMCODE IS NULL 

UNION 

SELECT B.* FROM (SELECT * FROM MYTABLE WHERE ITEMCODE='B')B 
     LEFT JOIN (SELECT * FROM MYTABLE WHERE ITEMCODE='A')A ON 
    B.TOTAL=A.TOTAL 
WHERE A.ITEMCODE IS NULL 
Verwandte Themen