SQL WHERE IF子句问题

时间:2014-07-02 14:41:20

标签: mysql

我有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子句问题。我读过一些可能会利用案例的论坛吗?

3 个答案:

答案 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