我有SQL / Java代码问题。基本覆盖如下:带有表的MySQL数据库。在此表中有多列。一列由名称组成。相关列是月份。在第三列中有计数。所以样本表将是
john - january - 5
john - january - 6
mary - january - 5
Alex - February- 5
John - February - 6
John - February - 4
Mary - February - 3
John - march - 4
表继续到5月。
所以John出现在五个月内,Mary出现在3,而Alex出现在一起。目前,我的SQL查询有点像这样。
select name, sum(count)/4
from table where (category ='something'
AND month not like 'May') group by name;
基本上,这个查询应该做的只是显示每个名字的平均每月计数。因此,总和将除以4(因为我排除了May,所以它必须划分Jan-April / 4)。但是,问题是某些名称只出现在一个月(或两个或三个)中。
这意味着对于该名称,计数的总和将仅除以该特定数字,以获得该月份的平均计数。我该怎么做?我觉得好像这需要在where子句中使用if语句。有点像,如果不同的计数(因为月份可能重复)是某个数字,那么将每个名称的总和(计数)除以该数字?
另外,我认为它可能不是if子句问题。我读过一些可能会利用案例的论坛吗?
答案 0 :(得分:2)
如果您需要每月平均值,您可以使用GROUP BY名称和月份并使用AVG功能:
SELECT `name`, `month`, avg(`count`)
FROM table
WHERE `category` ='something' AND `month` NOT LIKE 'May'
GROUP BY `name`, `month`;
如果您需要所有期间的平均值,只需GROUP BY名称和AVG计数:
SELECT `name`, avg(`count`)
FROM table
WHERE `category` ='something' AND `month` NOT LIKE 'May'
GROUP BY `name`;
另一种选择,如果你不喜欢AVG
:
SELECT `name`, sum(`count`)/(SELECT count(*) FROM `table` AS `t2` WHERE `category` ='something' AND `month` NOT LIKE 'May' and `t1`.`name` = `t2`.`name`)
FROM `table` AS `t1`
WHERE `category` ='something' AND `month` NOT LIKE 'May')
GROUP BY name;
但我会留在AVG
。
实际上,我更倾向于使用!=
而不是NOT LIKE
来提高可读性
答案 1 :(得分:1)
为了完整起见,这里是WORKING FIDDLE。使用AVG功能是可行的,因为它可以达到每人每月的平均值。一月份看约翰。他的结果是5.5,当计数(1月)是5和6 ..平均= 5.5。
SELECT
person,
month,
avg(counter)
FROM testing
where
(
category ='something'
AND month <> 'May'
)
GROUP BY person, month;
如果你想看到一个像你的帖子那样的数据,你可以这样做。 ANOTHER FIDDLE
SELECT
person,
group_concat(month),
group_concat(average_count)
FROM(
SELECT
person,
month,
avg(counter) as average_count
FROM testing
where
(
category ='something'
AND month <> 'May'
)
GROUP BY person, month
) as t
group by person;
答案 2 :(得分:0)
试试这个:
SELECT name, SUM(count) / COUNT(DISTINCT month)
FROM table
WHERE month != 'May'
AND category = 'something'
GROUP BY name