2016-09-20 1 views
0

Mon tableaurequête une colonne qui n'a pas la même valeur dans une autre colonne

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 

je veux afficher tous itemcodeA et B qui n'a pas la même valeur dans la colonne Total

Mon attendu Résultat

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

J'ai déjà posé cette question mais cette fois ma question est beaucoup plus claire que mes dernières questions iton. Je pense que 1 solution pour ceci est une jointure de soi mais je ne peux pas la comprendre. toute aide signifierait beaucoup pour moi merci!

+1

Toujours pas clair pour moi: pourquoi les lignes avec ItemCode = 'A' dans le résultat attendu? ils viennent de rangs parfaitement égaux, avec le même Total, alors que vous dites "n'a pas la même valeur dans la colonne Total". Voulez-vous dire que vous voulez seulement les lignes pour lesquelles n'existe pas une ligne d'un ItemCode différent avec le même Total? – Aleksej

+0

@Aleksej Salut Aleksej merci de m'aider vraiment. Tout ce que je veux, c'est obtenir tous les items dans les items 'A' et 'B' qui n'ont pas le même 'Total' mais s'ils sont dans le même itemcode et ont le même total, je veux qu'ils soient inclus. –

+0

Voulez-vous seulement pour la paire A et B ou pour chaque paire comme (A, C) (B, C) etc –

Répondre

1

En supposant que vous avez besoin des lignes pour qui n'existe pas une autre ligne d'un itemCode différent avec le même Total, et en supposant que ItemCode est toujours non nul, une solution simple peut être ceci:

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') 
       ) 

ce qui suit est plus rapide, mais moins lisible:

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

Cela a effectivement fonctionné! Merci l'homme @Aleksej 5 pouces vers le haut! –

1

essayez cette requête:

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