Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 计算多个月的不同值_Mysql - Fatal编程技术网

Mysql 计算多个月的不同值

Mysql 计算多个月的不同值,mysql,Mysql,这里有点小问题。我一辈子都想不出怎么做 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

这里有点小问题。我一辈子都想不出怎么做

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;
输出:

一月:

二月:

这是伟大的第一个月,但我需要这一整年。我可以运行这个查询12次,但是出现了两个问题。我全年有300多个邮政编码。在某些月份,邮政编码不存在,因此计数为0(但MySQL输出不输出“零数据”。此外,当我按totalzip订购时,订单每月都会发生变化,这不允许我将其粘贴到电子表格中。我可以按邮政编码订购,但也可以按“零”订购数据zipcodes不存在,因此列表每月都会更改


任何想法或建议都将不胜感激。

如果您有一个zipcode表(您应该),您可以将其与您的数据表(左连接)连接,这将带来零计数zipcodes。

如果您有一个zipcode表(您应该),您可以将其与您的数据表连接(左连接),这甚至会带来零计数的zipcodes。

问题的第一部分通过附加分组解决。请尝试以下方法:

 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; 

问题的第一部分通过附加分组解决。请尝试以下方法:

 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; 

您可以使用子查询执行此操作:

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
这应该给你每个月的拉链数量,包括零

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

首先,我定义了一个子查询,该子查询可以实现ZIP和月份的所有可能组合(子查询
a
子查询),然后我将其与第二个子查询(子查询
c
子查询)连接起来,该子查询返回ZIP和月份的值。使用
left join
可以计算
a
子查询中可能的空组合

希望这对你有帮助


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

您可以通过子查询实现此功能:

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
这应该给你每个月的拉链数量,包括零

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

首先,我定义了一个子查询,该子查询可以实现ZIP和月份的所有可能组合(子查询
a
子查询),然后我将其与第二个子查询(子查询
c
子查询)连接起来,该子查询返回ZIP和月份的值。使用
left join
可以计算
a
子查询中可能的空组合

希望这对你有帮助


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

只是一条注释:这只在表不大的情况下有效,因为
last_-day()
函数必须为每个记录求值。但是,由于您已经使用
month()
函数对数据进行分组,这可能正是您所需要的。您的查询肯定有问题。任何月份的所有拉链都只返回“0”或“1”访问。其中一些ZIP应该有近100次访问。@user1532528好吧,你说得对!对不起,我假设你想要一个独特的ZIP计数…再次检查答案,我已经编辑了查询(只需删除query
c
中的
distinct
。只是一个注释:这只适用于你的表不大的情况,因为
最后一天()
函数必须为每个记录求值。但是,由于您已经使用
month()
函数对数据进行分组,这可能正是您所需要的。您的查询肯定有问题。任何月份的所有拉链都只返回“0”或“1”访问。其中一些ZIP应该有近100次访问。@user1532528好吧,你说得对!对不起,我假设你想要一个独特的ZIP计数…再次检查答案,我已经编辑了查询(只需删除query
c
中的
distinct
。感谢大家的帮助。我能够使用您的一些想法走得更远一些。但是,我在获取格式良好的数据时仍然遇到问题。从生产内部联接中选择*(选择distinct zip,将(zip)计算为一月从生产中的月份(LastVisite)=“1”按zip分组)作为JanCount ON(production.zip=JanCount.zip)内部连接(选择不同的zip,将(zip)作为二月从生产日期算起,其中月份(上次访问)=“2”按zip分组)作为FebCount ON(production.zip=FebCount.zip)但是我得到了重复的记录。我只是一个基本的mysql用户,所以我不确定这些连接是如何工作的以及为什么数据会重复。我需要的是这样的行:46516:71 | 45 | 32 | 45 | 12 | 66 | 55 | 32 | 22 | 66 | 71 | 12(每个数字代表一个月(1-12月)检查我的答案…这将为您提供您所需的帮助。感谢您的帮助。使用您的一些想法,我能够走得更远一些。但是,我仍然在获取格式良好的数据时遇到问题。从生产内部连接中选择*作为JanCount ON(production.zip=JanCount.zip)的内部连接(选择不同的zip,将(zip)作为生产的二月,其中月份(LastVisite)=“2”组按zip)作为FebCount ON(production.zip=FebCount.zip)但是我得到了重复的记录。我只是一个基本的mysql用户,所以我不确定这些连接是如何工作的以及为什么数据会重复。我需要的是这样的行:46516:71 | 45 | 32 | 45 | 12 | 66 | 55 | 32 | 22 | 66 | 71 | 12(每个数字代表一个月的计数)