2010-10-27 4 views
1

Je suis en train de mettre sur pied une requête qui me donne un rapport du nombre de ventes de produits et leur niveau de stock en 3 endroits distincts (branches de magasin)Pas sûr comment joindre des tables 3 fois pour obtenir le résultat souhaité

l'idée est de regrouper les résultats comme suit:

Prod. | Loc1 Sales | Loc1 Stk | Loc2 Sales | Loc2 Stk | Loc3 Sales | Loc3 Stk 
    Item 1 | 323  | 34  | 23   | 7  |  119 | 54 
    Item 2 | 653  | 566  | 84   | 45  |  476 | 3434 
    Item 3 | 121  | 23  | 300  | 5643  |  12 | 3434 

je peux commencer en saisissant les produits et la qté d'un endroit:

SELECT col.productname, sum(col.quantity) as qty 
FROM  customerorderlines col 
JOIN  customerorders co 
ON  co.id = col.customerorder_id 
WHERE  co.orderdate BETWEEN 'start date here' AND 'end date here' 
AND  co.location_id = 1 
GROUP BY product_id 
ORDER BY qty DESC 

résultat:

productname | qty 
item 1  | 146 
item 2  | 74 
item 3  | 63 
item 4  | 49 

Maintenant, j'essaie de se joindre à la table des actions là-bas:

SELECT  col.productname, sum(col.quantity) AS qty, sum(s.stocklevel) AS stocklevel 
FROM  customerorderlines col 
JOIN  customerorders co 
ON   co.id = col.customerorder_id 
JOIN  stock s 
ON   s.product_id = col.product_id 
WHERE  co.orderdate BETWEEN 'start date here' AND 'end date here' 
AND  co.location_id = 1 
AND  s.location_id = 1 
GROUP BY col.product_id 
ORDER BY qty DESC 

Ceci, bien sûr, le travail ne marche pas:

productname | qty | stocklevel 
item 1  | 246 | 89123 
item 2  | 98 | 18454 
item 3  | 78 | 22565 

Non seulement les stocklevels mal, il ébouriffe up la quantité aussi. Pourtant, je sais que ce nest pas la façon d'écrire d'aller à ce sujet, alors j'essaie avec une jointure:

SELECT  col.productname, sum(col.quantity) AS qty, sl.stocklevel 
FROM  customerorderlines col 
JOIN  (SELECT 
      product_id 
      ,location_id 
      ,SUM(stocklevel) AS stocklevel 
      FROM stock 
      GROUP BY product_id 
      ) sl 
ON   sl.product_id = col.product_id 
JOIN  customerorders co 
ON   co.id = col.customerorder_id 
JOIN  stock s 
ON   s.product_id = col.product_id 
WHERE  co.orderdate BETWEEN 'start date here' AND 'end date here' 
AND  co.location_id = 1 
AND  s.location_id = 1 
GROUP BY col.product_id 
ORDER BY qty DESC 

Avec cette jointure, qui fonctionne comme une requête sur elle-même, j'attends environ 8 minutes avant que je tue le processus parce qu'il se trouve juste là.

Des suggestions?

Merci à l'avance, Rob

Répondre

1
SELECT p.name, 
     (
     SELECT SUM(col.quantity) 
     FROM customerorder co 
     JOIN customerorderlines col 
     ON  col.customerorder_id = co.id 
     WHERE co.localtion_id = 1 
       AND co.orderdate BETWEEN @start AND @end 
       AND col.product_id = p.id 
     ), 
     (
     SELECT SUM(stocklevel) 
     FROM stock s 
     WHERE s.location_id = 1 
       AND s.product_id = p.id 
     ), 
     (
     SELECT SUM(col.quantity) 
     FROM customerorder co 
     JOIN customerorderlines col 
     ON  col.customerorder_id = co.id 
     WHERE co.localtion_id = 2 
       AND co.orderdate BETWEEN @start AND @end 
       AND col.product_id = p.id 
     ), 
     (
     SELECT SUM(stocklevel) 
     FROM stock s 
     WHERE s.location_id = 2 
       AND s.product_id = p.id 
     ), 
     (
     SELECT SUM(col.quantity) 
     FROM customerorder co 
     JOIN customerorderlines col 
     ON  col.customerorder_id = co.id 
     WHERE co.localtion_id = 3 
       AND co.orderdate BETWEEN @start AND @end 
       AND col.product_id = p.id 
     ), 
     (
     SELECT SUM(stocklevel) 
     FROM stock s 
     WHERE s.location_id = 3 
       AND s.product_id = p.id 
     ) 
FROM product p 
+0

Merci. Je vais donner à celui-ci un essai routier. J'ai essayé d'exécuter plusieurs sous-marins ensemble mais j'ai continué à obtenir une erreur 'l'opérande devrait contenir une colonne'. D'un simple coup d'œil, je n'arrivais pas à comprendre pourquoi. – prevailrob

+0

@prevailrob: probablement parce que vous avez retourné plus d'une colonne dans les sous-requêtes scalaires :) – Quassnoi

Questions connexes