2010-12-06 7 views
2

Je ne sais pas si j'utilise UNION correctement dans ce scénario - il peut bien être un moyen de mieux/plus facile et je suis ouvert aux suggestions:Union MySQL et moyenne

je le code suivant :

SELECT COUNT(*), AVG (q1) AS q1, AVG (q2) AS q2, AVG (q3) AS q3, AVG (q4) AS q4, AVG (q5) AS q5, AVG (q6) AS q6, AVG (q7) AS q7, AVG (q8) AS q8, AVG (q9) AS q9, AVG (q10) AS q10, AVG (q11) AS q11, AVG (q12) AS q12, AVG (q13) AS q13, AVG (q14) AS q14, AVG (q15) AS q15, AVG (q16) AS q16, AVG (q17) AS q17, AVG (q18) AS q18, AVG (q19) AS q19, AVG (q20) AS q20, AVG (q21) AS q21, AVG (q22) AS q22 FROM thotels_results WHERE brand = 'EFG' AND date = 'NOV2010' GROUP BY brand 
UNION 
SELECT COUNT(*), AVG (q1) AS q1, AVG (q2) AS q2, AVG (q3) AS q3, AVG (q4) AS q4, AVG (q5) AS q5, AVG (q6) AS q6, AVG (q7) AS q7, AVG (q8) AS q8, AVG (q9) AS q9, AVG (q10) AS q10, AVG (q11) AS q11, AVG (q12) AS q12, AVG (q13) AS q13, AVG (q14) AS q14, AVG (q15) AS q15, AVG (q16) AS q16, AVG (q17) AS q17, AVG (q18) AS q18, AVG (q19) AS q19, AVG (q20) AS q20, AVG (q21) AS q21, AVG (q22) AS q22 FROM thotels_results WHERE brand = 'XYC' AND date = 'NOV2010' GROUP BY brand 
UNION 
SELECT COUNT(*), AVG (q1) AS q1, AVG (q2) AS q2, AVG (q3) AS q3, AVG (q4) AS q4, AVG (q5) AS q5, AVG (q6) AS q6, AVG (q7) AS q7, AVG (q8) AS q8, AVG (q9) AS q9, AVG (q10) AS q10, AVG (q11) AS q11, AVG (q12) AS q12, AVG (q13) AS q13, AVG (q14) AS q14, AVG (q15) AS q15, AVG (q16) AS q16, AVG (q17) AS q17, AVG (q18) AS q18, AVG (q19) AS q19, AVG (q20) AS q20, AVG (q21) AS q21, AVG (q22) AS q22 FROM thotels_results WHERE brand = 'ABC' AND date = 'NOV2010' GROUP BY brand 

Il produit les éléments suivants:

 q1  q2  q3 etc.                       
140 8.7714 8.8429 8.1643 8.7500 8.7571 8.9000 9.4071 9.1214 8.5714 8.7643 9.5143 8.9429 9.1643 8.9857 7.9500 8.9286 8.7000 9.0429 9.0143 8.7214 9.1214 9.3071 
29 8.1724 8.2414 8.2414 7.8966 8.5862 8.5517 9.0000 8.5862 8.1724 7.9655 8.8966 8.6207 8.2414 8.3793 7.8276 8.3793 7.9310 8.4138 8.6897 8.3448 8.8621 8.5172 
897 8.6009 8.5686 7.8528 8.3133 8.3423 8.6410 9.0301 8.6912 8.3233 8.3389 9.2029 8.3969 8.6856 8.5017 7.8071 8.4816 8.3512 8.6789 8.6789 8.3913 8.6388 8.8986 

Tout ce que je voudrais 'que faire' est MOYENNE chaque des colonnes q1, q2, q3 ou SOMME leur et diviser par 3.

Comme je dis, s'il y a une meilleure façon qui n'utilise pas JOIN, c'est bien avec moi !!!

Merci d'avance,

Homer.

Répondre

3

(1) Vous n'avez pas besoin de calculer les résultats séparément, puis les UNION comme ça. (2) Je pense que WITH ROLLUP fera probablement ce dont vous avez besoin. Mais, comme cela a été souligné dans les commentaires, cela ne correspond pas au moyennage de la moyenne de la moyenne requise. Le meilleur que je pourrais trouver pour cela est

CREATE TEMPORARY TABLE results 
SELECT 
     brand, 
     COUNT(*) AS cnt, 
     AVG (q1) AS q1 
     ... 
FROM thotels_results 
WHERE brand in ('ABC','EFG','XYZ') AND date = 'NOV2010' 
GROUP BY brand; 

CREATE TEMPORARY TABLE results2 
SELECT cast(NULL as char), AVG(cnt), AVG(q1) 
FROM results r2; 


/*MySQL doesn't allow the same temp table to be accessed twice in a UNION!*/ 
SELECT * FROM results r 
UNION ALL 
SELECT * 
FROM results2; 

DROP TEMPORARY TABLE results; 
DROP TEMPORARY TABLE results2; 
+0

J'allais recommander de pivoter sur la marque, mais un rollup est beaucoup plus agréable pour le mainteneur. +1 –

+0

Petit problème - les moyennes ne sont pas correctes - par exemple, q1 ROLLUP indique 8.6116. Si vous ajoutez les trois sur Q1 ensemble et divisez par trois vous obtenez 8.5149 - des pensées? J'aime vraiment beaucoup cette approche - très propre et nette !!! –

+0

Hmmm, Les moyennes sont probablement correctes mais d'une manière différente. Avez-vous réellement besoin d'une moyenne de la moyenne qui pèse tous les 3 produits indépendamment du nombre d'enregistrements dans chaque marque? Cela donnera à la marque «XYC» qui a seulement un compte de «29» un poids disproportionné par rapport à la marque «ABC» et son compte de «897» –

1

Sans JOIN, pourquoi ne pas simplement utiliser une table temporaire ou une variable de table. insérer donc les SUM:

INSERT INTO TempTable (SELECT COUNT (*), SUM (q1) AS q1 .... DE thotels_results OU marque = 'EFG' ET date = GROUPE 'Nov2010' par marque)

INSERT INTO tempTable (SELECT COUNT (*), SOMME (q1) AS q1 .... DE thotels_results WHERE marque = 'XYC' et date = 'NOV2010' GROUP BY marque)

INSERT INTO tempTable (SELECT COUNT (*), SUM (q1) AS q1 .... DE thotels_results WHERE marque = 'ABC' ET date = 'NOV2010' marque GROUP BY)

Puis aller chercher l'image

SELECT SUM (q1)/3 comme q1Adverage, .... De TempTable

+0

Merci pour les commentaires. –