MySQL使用WHERE和GROUP BY年(),月()的2列的平均值

问题描述:

使用MySQL。如何按年份(my_date)和月份(my_date)分组时查找min_amount和max_amount列的平均值?MySQL使用WHERE和GROUP BY年(),月()的2列的平均值

目前我打算将列的总和放在一个数组中,然后使用PHP对它们进行平均。

有没有办法用SQL查询来取得2个分组列的平均值?

$sql = "SELECT 
    SUM(min_amount) AS sum_min_amount, 
    SUM(max_amount) AS sum_max_amount, 
    my_date 
FROM 
    table_1 
WHERE 
    name = '$name' 
AND 
    year(my_date) BETWEEN '$start_year' AND '$end_year' 
AND 
    month(my_date) BETWEEN '$start_month' AND '$end_month' 
GROUP BY 
    year(my_date), month(my_date)"; 
+0

您知道,如果您提供2009年至2010年的开始和结束年份,月份值为1和4 - 您只能获得两年前四个月的值? – 2010-11-08 17:20:06

+0

谢谢,我没有意识到这一点。我试图在两个日期之间获得一个月的平均值;这可能会跨越多年。什么是更好的方式来做到这一点? – Mark 2010-11-08 17:27:22

+0

“my_date”列的数据类型是什么?理想情况下,它应该是DATE,DATETIME或TIMESTAMP之一 – 2010-11-08 18:28:07

MySQL有内置在average function,所以应该没有必要做的事情PHP端以此计算,除非你有一个不能在查询中轻松地表达了一些丑陋的业务需求。

SELECT YEAR(my_date) AS year, 
    MONTH(my_date) AS month, 
    AVERAGE(min_amount) AS min_avg, 
    AVERAGE(max_amount) AS max_avg 
FROM table_1 
WHERE (my_date >= "$start_year-$start_month-01") 
    AND (my_date <= "$end_year-$end_month-31") 
    AND (name = $name) 
GROUP BY year, month 

你可能要正确地构建查询以外的数据串,和最肯定使用准备好的声明这一点,因为通常的“你对SQL注入大开”的攻击在这里举行。