是否有MySQL声明或需要多个语句?

时间:2015-10-11 21:33:45

标签: mysql

我有一个包含MLSNumber,ListingContractDate,CloseDate的表。

我想总结一下从当月开始的一个月的活动,然后回到2000年1月。

我有这个声明,按月总结了ListingContractDate。

SELECT COUNT(MLSNumber) AS NewListings, DATE_FORMAT(ListingContractDate,'%M %Y')
FROM Listings
WHERE Neighbourhood = 'Beachside' 
  AND ListingContractDate >= '2000-01-01' 
GROUP BY YEAR(ListingContractDate), MONTH(ListingContractDate)
ORDER BY ListingContractDate DESC

这个陈述的两个问题是如果在特定月份没有发现它跳过那个月,我需要返回0,所以没有几个月丢失,我不知道如何得到相同的数量CloseDate字段或者我只需运行第二个查询,并使用PHP按月和年匹配两个结果。

1 个答案:

答案 0 :(得分:0)

一个特别有用的项目是一个“计数表”,它只包含一组整数。我使用了一个找到HERE的脚本来生成这样一个表。

使用该表,我现在可以将与时间相关的数据LEFT JOIN连接到它,如下所示:

set @startdt := '2000-01-01';

SELECT COUNT(MLSNumber) AS NewListings, DATE_FORMAT(T.Mnth,'%M %Y') 
FROM (
      select
            tally.id
          , date_add( @startdt, INTERVAL (tally.id - 1) MONTH ) as Mnth
          , date_add( @startdt, INTERVAL tally.id MONTH ) as NextMnth
      from tally
      where tally.id <= (
          select period_diff(date_format(now(), '%Y%m'), date_format(@startdt, '%Y%m')) + 1
            )
     ) t
LEFT JOIN Temp On Temp.ListingContractDate >= T.Mnth and Temp.ListingContractDate < T.NextMnth
GROUP BY YEAR(T.Mnth), MONTH(T.Mnth) 
ORDER BY T.Mnth DESC

Logc,

  • 定义陈述日期
  • 计算从该日期到现在的月数(使用 PERIOD_DIFF + 1)
  • 从计数表中选择记录数
  • 创建期间开始和结束日期(tally.Mnth&amp; tally.NextMnth)
  • LEFT使用
  • 将实际数据加入计数表
  

Temp.ListingContractDate&gt; = T.Mnth和Temp.ListingContractDate&lt; T.NextMnth

  • 对数据进行分组和计数

请参阅this sqlfiddle`