2010-11-12 4 views
0

Donc ce que je veux faire:Comment puis-je réécrire cette requête sans sous-requêtes?

J'ai une table qui a quelques prix de certains articles d'un magasin, ce que je veux faire est de trouver le prix moyen de tous les articles vendus à partir de ce magasin, ET le somme de tous les articles similaires vendus en magasin.

Mes colonnes sont:

  • No_article
  • branche
  • TotalAmount

Ce qui est vraiment important est que je dois éviter les sous-requêtes, donc je ne pouvais pas faire quelque chose comme :

SELECT DISTINCT branch AS postcode, item_no, avg_price 
FROM Prices 
NATURAL JOIN (SELECT branch, AVG(totalamount) avg_price FROM Prices GROUP BY branch) av 
WHERE sum > avg_price ORDER BY turnover DESC , branch; 

Ce qui fait exactement ce que je veux faire, néanmoins je dois le faire sans sous-requêtes.

modifier 1 QUESTION:

Y AT-IL UNE DIFFÉRENCE entre les tables dérivées et temporaires? donc pour l'affectation, je ne suis pas autorisé à utiliser des sous-requêtes, ou des tables temporaires, donc ma réponse a-t-elle l'une de ces 2?

+0

Pour le prix moyen par branche, vous pouvez utiliser un autojointure et GROUP BY au lieu d'une sous-requête. Mais ce n'est pas clair pour moi ce que le reste fait ... quelle est la relation entre item_no et avg_turnover? Quelle est la clé primaire? Pouvons-nous voir le schéma? – bobince

+0

@Sam ... À noter: Ce que vous utilisez s'appelle des tables dérivées. Les sous-requêtes sont des instructions Select faisant partie de l'emplacement ou de la colonne. Pensez aux tables dérivées comme sélectionnant à partir d'une vue non indexée. –

+0

Pour quelle base de données? Bien qu'il soit probablement MySQL ... –

Répondre

0

Vous pouvez spécifier plusieurs instructions agrégées sur la même colonne ou sur des colonnes différentes dans la même instruction SELECT. Pour voir exactement ce que je veux dire jeter un oeil dans les livres en ligne.

http://msdn.microsoft.com/en-us/library/ms177677.aspx

+0

Cela a "devoirs" écrit partout. Vous pouvez le faire avec des tables temporaires (ou des variables temporaires dans le serveur sql), mais ce serait plus efficace avec une instruction sql qui utilise des sous-requêtes. – SteveCav

0

ici comment vous pouvez le faire,

SELECT branch AS postcode, 
     item_no, 
     AVG(totalamount) avg_price , 
     SUM(totalamount) sum 
FROM prices 
WHERE SUM(totalamount) > avg_turnover 
ORDER BY avg_turnover DESC , 
     eatit_Order.branch 
GROUP BY branch, 
     item_no; 
+0

Ensuite, dites-nous avec des exemples de données comment le résultat devrait ressembler. –