2010-12-06 28 views
2

私は、このシナリオでは正しくUNIONを使用していた場合、私はさっぱりだが - そこにも、より良い/より簡単な方法であると私は提案に開いていることがあります。MySQLの連合と平均

私は、次のコードを持っています:

 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 

私は 'やりたい' となるすべてがAVERAGEそれぞれです:

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 

これは、次の出力します3.

によってQ1、Q2、Q3の列またはSUMそれらと除算のI JOINを使用していない良い方法があれば、それは私と一緒に罰金だ、と言うのように!!!事前に

おかげで、

ホーマー。

答えて

3

(1)結果を個別に計算する必要はありません。UNIONそうです。 (2)私はWITH ROLLUPがおそらくあなたが必要とすることをすると思います。

SELECT COUNT(*), AVG (q1) AS q1,... 
FROM thotels_results WHERE brand in ('ABC','EFG','XYZ') AND date = 'NOV2010' 
GROUP BY brand 
WITH ROLLUP 

しかし、コメントに指摘されているように、これは「平均の平均」が必要ではありません。私がそれを思いつくことができる最高のは

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

私はブランドを旋回させることを勧めようとしていましたが、メンテナにはロールアップがはるかに優れています。 +1 –

+0

小さな問題 - 平均値が正しくない - たとえば、q1 ROLLUPが8.6116として表示されています。 3つをQ1に加えて3で割ると、8.5149が得られます。私はこのアプローチが本当に本当に好きです - とても清潔で鮮明です! –

+0

Hmmm、平均はおそらく正しいが、別のやり方である。実際には、各ブランドのレコード数に関係なく、3つすべての製品の重量を平均した平均値が必要ですか?ブランド「ABC」とその数「897」と比較して、「29」のカウントだけが不均衡な重量のブランド「XYC」をもたらすでしょう –

1

JOINがなければ、一時表や表変数を使用しないでください。だから、合計を挿入します。

INSERT INTO TEMPTABLE(SELECT COUNT(*)、SUM(Q1)Q1 AS ....ブランドで、ブランド= 'EFG' AND日付= 'NOV2010' GROUP thotels_results FROM)

INSERT INTO TEMPTABLE(SELECT COUNT(*)、SUM(Q1)Q1 AS ....ブランドで、ブランド= 'XYC' AND日付= 'NOV2010' GROUP thotels_results FROM)

INSERT INTO TEMPTABLE(SELECT COUNT( *)、SUM(q1)AS q1 .... FROM thotels_resultsブランド= 'ABC'と日付= 'NOV2010' GROUP BYブランド)

質問SUM(q1)/ 3をq1のように選択し、.... tempTableから

+0

フィードバックありがとうございます。 –