这里有点问题。我不能为我的生活,弄清楚如何做到这一点。
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;
输出:
1月:
zip | totalzip
---------------------
46530 | 2
46535 | 2
46521 | 1
二月:
zip | totalzip
---------------------
46530 | 1
46521 | 4
49112 | 3
这对于第一个月来说非常棒,但我整年都需要这个。我可以运行此查询12次,但会出现2个问题。我全年有超过300个邮政编码。在某些月份,邮政编码不存在,因此计数为0(但MySQL输出不输出“零数据”。而且,当我按totalzip订购时,订单会逐月变化,而这不是允许我将它们粘贴到电子表格中。我可以通过邮政编码订购,但是“零”数据邮政编码不再存在,因此列表会逐月变化。
非常感谢任何想法或建议!
答案 0 :(得分: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
这可以为您提供每个月的拉链数,包括零。
让我解释一下这是如何运作的:
首先,我定义了一个子查询,它使 all 成为拉链和月份的可能组合(a
子查询),然后我离开加入了第二个子查询,返回值ZIP和月份(c
子查询)。使用left join
可以计算a
子查询中可能的空组合。
希望这对你有所帮助。
注意:last_day()
函数返回给定日期的月份的最后一天;例如:last_day('2012-07-17')='2012-07-31'
答案 1 :(得分:0)
如果你有一个邮政编码表(你应该),你可以将它与你的数据表(一个左连接)连接起来,这样就可以带来零计数的拉链码。
答案 2 :(得分:0)
您的问题的第一部分通过其他分组解决。尝试这样的事情:
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;