【问题标题】:MySQL Union and AverageMySQL 联合和平均
【发布时间】:2010-12-06 21:58:34
【问题描述】:

我不知道在这种情况下我是否正确使用了 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 = '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

它输出以下内容:

       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 q1、q2、q3 列中的每一个或 SUM 并除以 3。

就像我说的,如果有更好的方法不使用 JOIN,那我没问题!!!

提前致谢,

荷马。

【问题讨论】:

    标签: mysql database sum union average


    【解决方案1】:

    (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
    

    但正如 cmets 中所指出的,这并没有达到所需的“均值”平均值。我能想到的最好的就是

    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;
    

    【讨论】:

    • 我打算推荐以品牌为中心,但汇总对维护者来说要好得多。 +1
    • 小问题 - 平均值不正确 - 例如 q1 ROLLUP 显示为 8.6116。如果将 Q1 上的三个加在一起并除以 3,则得到 8.5149 - 有什么想法吗?我真的很喜欢这种方法 - 非常干净清爽!!!
    • 嗯,平均值可能是正确的,但方式不同。无论每个品牌中的记录数量如何,您是否真的需要平均衡量所有 3 种产品的平均值?与品牌 ABC 及其数量 897 相比,这将使品牌 XYC 的数量仅为 29 的权重不成比例。
    • 是的,这是一个奇怪的结果——我不需要对它们进行加权(至少目前不需要!)——为了保持一致性,我希望将三个分数相加并除以 3 即 8.5149。 (当前的 8.6116 很可能是加权平均值,不确定还没有计算出来!) - 谢谢 Martin。
    【解决方案2】:

    如果没有 JOIN,为什么不直接使用临时表或表变量。所以插入 SUM:

    INSERT INTO tempTable(SELECT COUNT(*), SUM(q1) AS q1.... FROM thotels_results WHERE brand = 'EFG' AND date = 'NOV2010' GROUP BY brand)

    INSERT INTO tempTable(SELECT COUNT(*), SUM(q1) AS q1.... FROM thotels_results WHERE brand = 'XYC' AND date = 'NOV2010' GROUP BY brand)

    INSERT INTO tempTable(SELECT COUNT(*), SUM(q1) AS q1.... FROM thotels_results WHERE brand = 'ABC' AND date = 'NOV2010' GROUP BY brand)

    然后获取广告

    SELECT SUM(q1) / 3 as q1Adverage,.... 来自 tempTable

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 2018-10-09
      • 2018-08-13
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      相关资源
      最近更新 更多