2010-07-22 7 views
0

La question est:Comment obtenir ce résultat avec et seulement avec SQL?

Deux tables (t1, t2)

Tableau t1:

SELLER | NON_SELLER 
    A  B 
    A  C 
    A  D 
    B  A 
    B  C 
    B  D 
    C  A 
    C  B 
    C  D 
    D  A 
    D  B 
    D  C 

Tableau t2:

SELLER | COUPON | BAL 
A  9  100 
B  9  200 
C  9  300 
D  9  400 
A  9.5  100 
B  9.5  20 
A  10   80 

Utilisation SELECT Déclaration pour obtenir ce résultat:

SELLER| COUPON | SUM(BAL) 
A  9  900 
B  9  800 
C  9  700 
D  9  600 
A  9.5  20 
B  9.5  100 
C  9.5  120 
D  9.5  120 
A  10   0 # !!! 
B  10   80 
C  10   80 
D  10   80 

Pour le vendeur A SUM(BAL) signifie sum(B.BAL,C.BAL,D.BAL), B, SUM(BAL)=SUM(A.BAL,C.BAL,D.BAL) ...

S'il vous plaît trouver un moyen avec une bonne performance et ne pas utiliser la table temporaire.

Ma solution:
L'exécution de cette requête obtenir le résultat mais sans la ligne "A 10 0":

select t1.seller, t2.coupon, sum(bal) 
    from t1, t2 
    where t1.non_seller = t2.seller 
    group by t1.seller, t2.coupon 
    order by t2.coupon 

S'il vous plaît aider ~~~~~~

+0

jointure gauche ne contribuent pas, s'il vous plaît Notez les données très soigneusement –

+0

Avez-vous une autre table avec une liste de coupons? Quelle est l'efficacité de la requête? vous pouvez toujours essayer une jointure externe avec une somme (CAS WHEN t2.Seller = t1.NonSeller THEN t2.BAL ELSE 0 END), mais ce n'est pas idéal –

+0

@Jammy Lee: J'ai reformaté votre question. Veuillez consulter la version éditée et lire [Markdown Editing Help] (http://stackoverflow.com/editing-help) pour plus d'informations. –

Répondre

1

Si je comprends vous avez correctement, vous recherchez des données sur tous les vendeurs et tous les coupons. Alors commençons par un cross join qui génère une liste des coupons et des vendeurs:

select sellers.seller 
,  coupons.coupon 
from (
     select distinct seller 
     from Table2 
     ) as sellers 
cross join 
     (
     select distinct coupon 
     from Table2 
     ) as coupons 

Pour chaque combinaison vendeur coupon, vous cherchez la somme qu'ils peuvent acheter d'autres vendeurs. Ceci peut être accompli par une jointure gauche:

select sellers.seller 
,  coupons.coupon 
,  case when sum(t2.bal) is null then 0 else sum(t2.bal) end 
from (
     select distinct seller 
     from Table2 
     ) as sellers 
cross join 
     (
     select distinct coupon 
     from Table2 
     ) as coupons 
left join 
     Table2 t2 
on  t2.seller <> sellers.seller 
     and t2.coupon = coupons.coupon 
group by 
     sellers.seller 
,  coupons.coupon 

La seule fonction de l'instruction case est de remplacer une somme null avec un 0.

La sortie correspond à celle de votre réponse. Notez que cette solution n'utilise pas Table1: la liste des autres vendeurs est produite par la condition t2.seller <> sellers.seller dans le left join.

+0

Great !!!!!!!!!! super merci pour @Andomar –

+0

Je pense que pour le premier tableau de jointure nous devrions utiliser t1, pas t2, puisque les données de t2 peuvent ne pas inclure tous les vendeurs: ( select distinct seller du tableau1 ) en tant que vendeurs –

0

je reçois une autre façon à ceci:

select t1.seller, t2.coupon, sum(bal) 
    from t1, t2 
    where t1.non_seller = t2.seller 
    group by t1.seller, t2.coupon 
    union 
    (select seller,coupon,0 from t2 group by coupon having count(seller) == 1); 

Et je ne sais pas si elle est meilleure ou pire que comparer avec @Andomar:

select sellers.seller 
,  coupons.coupon 
,  case when sum(t2.bal) is null then 0 else sum(t2.bal) end 
from (
     select distinct seller 
     from Table2 
     ) as sellers 
cross join 
     (
     select distinct coupon 
     from Table2 
     ) as coupons 
left join 
     Table2 t2 
on  t2.seller <> sellers.seller 
     and t2.coupon = coupons.coupon 
group by 
     sellers.seller 
,  coupons.coupon 
Questions connexes