2012-07-17 53 views
1

在这里遇到了一些问题。我不能为我的生活,找出如何做到这一点。计算多个月的不同值

pid | firstlast | lastvisit | zip 
--------------------------------------- 
435 | 2001-01-17 | 2012-01-21 | 46530 
567 | 2001-01-18 | 2012-01-21 | 46530 
532 | 2001-01-19 | 2012-01-22 | 46535 
536 | 2001-01-19 | 2012-01-23 | 46535 
539 | 2001-01-20 | 2012-01-27 | 46521 

这里是我的SQL查询:

SELECT DISTINCT zip, COUNT(zip) AS totalzip FROM production WHERE MONTH(lastvisit) = "1" GROUP BY zip ORDER BY totalzip DESC; 

输出:

扬:

zip | totalzip 
--------------------- 
46530 | 2 
46535 | 2 
46521 | 1 

二月:

zip | totalzip 
--------------------- 
46530 | 1 
46521 | 4 
49112 | 3 

这对第一个月来说很棒,但我需要整整一年。我可以运行此查询12次,但会出现2个问题。全年我有超过300个邮政编码。在某些月份,邮政编码不存在,因此计数为0(但MySQL输出不输出“零数据”。此外,当我通过totalzip订购时,订单每个月都会发生变化,而这并不允许我将它们粘贴到电子表格中,我可以通过邮政编码进行订购,但“零”数据邮政编码不存在,因此列表每月变化不定。 !

+0

感谢您的帮助球员。使用你的一些想法,我能够进一步发展。尽管如此,我仍然遇到了获取格式良好的数据的问题。 SELECT * FROM生产 INNER JOIN (SELECT DISTINCT拉链,COUNT(拉链)AS扬从生产WHERE MONTH(lastvisit)= “1” GROUP BY拉链)AS JanCount ON (production.zip = JanCount。拉链) INNER JOIN (SELECT DISTINCT拉链,COUNT(拉链)AS二月从生产WHERE MONTH(lastvisit)= “2” GROUP BY拉链)AS FebCount ON (production.zip = FebCount.zip) 但我得到了重复的记录。 – user1532528 2012-07-17 18:52:53

+0

我只是一个基本的mysql用户,所以我不确定这些连接是如何工作的以及为什么数据在重复。 我需要的是这样的排: 46516:71 | 45 | 32 | 45 | 12 | 66 | 55 | 32 | 22 | 66 | 71 | 12 (每个数字代表一个月的计数(1月 - 12月) – user1532528 2012-07-17 18:54:22

+0

检查我的答案...这会给你你需要的东西 – Barranka 2012-07-17 20:28:38

回答

1

您可以使用子查询这项工作:

select 
    a.*, count(c.zip) as totalZip 
from 
    (select 
     monthVisit, zip 
    from 
     (select distinct last_day(lastVisit) as monthVisit from production) as m, 
     (select distinct zip from production) as z 
    ) as a 
    left join (select 
        last_day(lastVisit) as monthVisit, zip 
       from production) as c 
     on a.monthVisit=c.monthVisit and a.zip=c.zip 
group by 
    a.monthVisit, a.zip 

这应该给你呼啸而过的计数每个月你有,包括零。

让我解释一下这是如何工作:

首先,我定义了一个子查询,使所有可能的拉链和几个月的组合(该a子查询),然后我离开了第二子查询加入了这一点,返回ZIP和月份的值(c子查询)。使用left join可以计算a子查询中可能的空组合。

希望这对你有所帮助。

注意:last_day()函数返回给定日期的月份的最后一天;例如:last_day('2012-07-17')='2012-07-31'

+0

只是一个评论:这只适用于如果你的表不大,自'last_day ()'函数必须为每条记录进行评估,但是,由于您已经使用'month()'函数对数据进行了分组,所以这可能正是您所需要的。 – Barranka 2012-07-17 18:09:39

+0

您的查询必须有错误。在任何一个月的拉链只会返回“0”或“1”访问,其中一些拉链应该有近百次访问, – user1532528 2012-07-18 14:34:18

+0

@ user1532528呃,你说的对不对,我想你想要一个独特的拉链数。再次检查答案,我编辑了查询(只需在查询'c'中删除'distinct']。 – Barranka 2012-07-18 16:22:53

0

如果你有邮政编码表(你应该),您可以与您的数据表(左连接),这将使甚至零计数邮编加入。

0

你的问题的第一部分用另外的分组解决RY是这样的:有一个完整列表

SELECT DISTINCT zip, YEAR(lastvisit), MONTH(lastvisit), COUNT(zip) AS totalzip 
FROM production 
GROUP BY zip, YEAR(lastvisit), MONTH(lastvisit) 
ORDER BY totalzip DESC; 

要在“零”摘要加时不存在数据通常我做了左联接。 (这也是由上面的@Alfabravo声明的)。所以最终的查询看起来有点像:

SELECT DISTINCT zip, YEAR(lastvisit), MONTH(lastvisit), COUNT(zip) AS totalzip 
FROM production left join 
     (SELECT DISTINCT zip from production) as zipMap on zipmap.zip = production.zip 
GROUP BY zip, YEAR(lastvisit), MONTH(lastvisit) 
ORDER BY totalzip DESC;