使用Union All获得总数

时间:2013-12-17 22:55:00

标签: mysql sql

所以这是我的情况。我有1个查询按日期分组结果然后我联合所有第二个查询获得总数(没有按日期分组)。我的问题是我正在计算字段的平均值,当我想要总计平均值时,我的数字不会加起来。

这是我的SQLFiddle

这是我的问题:

SELECT
    t.end,
    SUM(CASE WHEN (t.start != t.end) THEN TIMESTAMPDIFF(DAY, t.start, t.end) ELSE 1 END) / COUNT(t.id) as averageTime
FROM store t
GROUP BY t.end
UNION ALL
SELECT
    'Total',
    SUM(CASE WHEN (t.start != t.end) THEN TIMESTAMPDIFF(DAY, t.start, t.end) ELSE 1 END) as averageTime
FROM store t

现在第二个查询只给出总数而不是平均值的总和。感谢任何帮助,谢谢。

澄清,因为有一些混乱......

我需要根据该组中的项目数量获得每个分组日期的平均值

timeDiff / count(t.id)

由于我没有在union中对所有查询进行分组,因此它将整体进行分割。我希望这更有意义。

第一个查询是正确的,数据输出如下:

1,1.66767,3(这些是第一个查询的averageTime值) 5.6667(应该是总行)现在我把它放在第10行的平均值之前的总数为10。

3 个答案:

答案 0 :(得分:2)

查询的第一部分可能写成:

SELECT t.end,
       AVG(CASE WHEN t.start != t.end THEN TIMESTAMPDIFF(DAY, t.start, t.end) ELSE 1
           END) as averageTime
FROM store t
GROUP BY t.end;

据推测,您需要平均值的平均值 - 而不是整体平均值。我假设这是因为您的查询正在计算总体平均值。

一种方式是蛮力方式:

SELECT t.end,
       AVG(CASE WHEN t.start != t.end THEN TIMESTAMPDIFF(DAY, t.start, t.end) ELSE 1
           END) as averageTime
FROM store t
GROUP BY t.end
UNION ALL
SELECT 'Total', avg(AverageTime)
FROM (SELECT t.end,
             SUM(CASE WHEN t.start != t.end THEN TIMESTAMPDIFF(DAY, t.start, t.end) ELSE 1
                 END) as averageTime
      FROM store t
      GROUP BY t.end
     ) t;

答案 1 :(得分:0)

你的问题不明确。但是,我想你需要平均值。正如@samD提到的那样,

您查询的第二部分可以写为

选择     '总',     AVG(CASE WHEN(t.start!= t.end)THEN TIMESTAMPDIFF(DAY,t.start,t.end)ELSE 1 END)as averageTime 从商店t

答案 2 :(得分:0)

您错误地认为第一个查询中的COUNT(t.id)表示总行数,而实际上它也受GROUP BY子句的影响。如果将单独的行乘以它们的天数,则总计也会相加。按COUNT(t.id)删除除法,总计将加起来,您将按预期正确地获得分组的SUM。

我只是不确定这是如何解决你的问题的,因为你不是很清楚:你根本无法将所有平均值加在一起并期望它们加起来达到全球平均值,这不是数学运算的方式:总和任意大小的子群的平均值很少等于所有群体的直接未加权平均值。