2012-08-28 2 views
1

un corps peut m'aider s'il vous plaît? Je veux interroger à partir de ma table, le but est de montrer quels employés vendent plus de 100 pièces. je l'ai fait cette requête et de travaux,obtenir la dernière activité avec somme, groupe et sous-requête

mais le problème se pose lorsque je veux afficher la dernière fois de la vente de chaque employé (qui vendent des produits de plus de 100 pièces)

j'ai la table TBL_SALES comme

no employee_id name   pieces sl_time 
---|-------------|-------------|--------|---------- 
1 |  1  | bungdito | 60  | 2012-03-29 22:20 
2 |  1  | bungdito | 40  | 2012-03-05 18:00 
3 |  1  | bungdito | 50  | 2012-02-18 08:00 
4 |  2  | addheat  | 120 | 2012-02-12 09:30 
5 |  3  | angga  | 20  | 2012-01-18 10:45 
6 |  4  | dimas  | 50  | 2012-01-01 08:30 

quand j'utilise requête comme ceci

select * from 
( 
    select EMPLOYEE_ID, NAME, sum(PIECES) PIECES from 
    ( 
    select EMPLOYEE_ID, NAME, PIECES 
    from DB_SCHEMA.TBL_SALES 
) 
    group by EMPLOYEE_ID, NAME 
) where PIECES > 100 

j'ai ce correct res ULT

employee_id name   pieces 
-------------|-------------|-------- 
    1  | bungdito | 150  
    2  | addheat  | 120  

le résultat ci-dessus est correct,

mais ce j'ai besoin est avec chaque employé la dernière fois la transaction

j'ai essayé de faire requête mais toujours pas correct

select * from 
( 
    select EMPLOYEE_ID, NAME, sum(PIECES) PIECES, SL_TIME 

    ( 
    select EMPLOYEE_ID, NAME, PIECES,(select max(WAKTU) SL_TIME from DB_USER.TR_PELANGGARAN where TB_SALES.EMPLOYEE_ID = EMPLOYEE_ID from TB_SALES) SL_TIME 
    from DB_SCHEMA.TBL_SALES 
) 
    group by EMPLOYEE_ID, NAME, SL_TIME 
) where PIECES > 100 

utilisant cette requête j'ai encore le mauvais résultat (voir le sl_time est le même entre bungdito et addheat) comme:

employee_id name   pieces sl_time 
    -------------|-------------|--------|---------- 
     1  | bungdito | 150 | 2012-03-29 22:20 
     2  | addheat  | 120 | 2012-03-29 22:20 

ce que j'ai besoin est comme ceci ci-dessous:

employee_id name   pieces sl_time 
-------------|-------------|--------|---------- 
    1  | bungdito | 150 | 2012-03-29 22:20 
    2  | addheat  | 120 | 2012-02-12 09:30 

Répondre

1

Essayez ceci:

select EMPLOYEE_ID, NAME, sum(PIECES) PIECES, MAX(SL_TIME) 
    from DB_SCHEMA.TBL_SALES 
    group by EMPLOYEE_ID, NAME 
    having sum(PIECES) > 100 
+0

qu'est-ce que vous voulez dire par B dans MAX (B.SL_TIME)? – bungdito

+0

Juste une faute de frappe, je l'ai enlevé. – davidmontoyago

+0

ses travaux lorsque je supprime [ayant des pièces> 100], avec [ayant des pièces> 100] j'ai une erreur "pas une expression GROUP BY" .. pourquoi? – bungdito

1
select * 
from 
( 
    select EMPLOYEE_ID, NAME, sl_time 
     , sum(PIECES) over(partition by EMPLOYEE_ID) SUM_PIECES 
     , max(sl_time) over(partition by EMPLOYEE_ID) last_sl_time 
    from  
    DB_SCHEMA.TBL_SALES 
) 
where SUM_PIECES > 100 
and last_sl_time = sl_time 
; 
+0

incroyable, ça marche .. je vous ai dit si je suis novice en oracle: p – bungdito

+0

Je ne pense pas que la requête imbriquée est nécessaire. – davidmontoyago

+0

Cette requête n'est pas équivalente à la requête d'origine. La SUM et la dernière fois sont prises * avant * la clause WHERE est appliquée. La solution est simple. . . déplacez simplement la clause WHERE dans la sous-requête. –