2015-10-11 2 views
1

У меня есть таблица с MLSNumber, ListingContractDate, CloseDate.Есть ли заявление MySQL для этого или требуется несколько операторов?

Я хочу суммировать активность сгруппированных мой месяц, начиная с текущего месяца и вернуться в январе 2000 года

У меня есть это заявление, которое суммирует 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

A [скрипка] (http://sqlfiddle.com), пожалуйста? – hd1

+0

См. Скрипку по адресу http://sqlfiddle.com/#!9/8b34e/1 – OahuInvestor

ответ

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 & tally.NextMnth)
  • LEFT JOIN фактические данные в таблицу подсчета с использованием

Temp.ListingContractDate> = T.Mnth и Temp.ListingContractDate < T.NextMnth

  • группу и рассчитывать Полученные данные

см. this sqlfiddle`

Смежные вопросы