MySQL: вернуть 0, если строка не существует - PullRequest
4 голосов
/ 01 августа 2010

Я некоторое время ломал голову над этим, так что теперь я здесь :) Я новичок в SQL, так что, возможно, вам будет легко, ребята ...

Iзапрос:

SELECT COUNT(*) AS counter, recur,subscribe_date  
FROM paypal_subscriptions  
WHERE recur='monthly' and subscribe_date > "2010-07-16" and subscribe_date < "2010-07-23"  
GROUP BY subscribe_date  
ORDER BY subscribe_date  

Теперь указанные выше даты жестко запрограммированы, мое приложение предоставит переменный диапазон дат.

Сейчас я получаю таблицу результатов, в которойесть значение для этой даты.

counter |recur | subscribe_date   
2    |    Monthly | 2010-07-18  
3    |    Monthly | 2010-07-19  
4    |    Monthly | 2010-07-20    
6    |    Monthly | 2010-07-22

Я бы хотел вернуться в столбец счетчика, если дата не существует.

counter |recur | subscribe_date   
0    |    Monthly | 2010-07-16  
0    |    Monthly | 2010-07-17  
2    |    Monthly | 2010-07-18  
3    |    Monthly | 2010-07-19  
4    |    Monthly | 2010-07-20    
0    |    Monthly | 2010-07-21  
6    |    Monthly | 2010-07-22  
0    |    Monthly | 2010-07-23 

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 01 августа 2010

Вам понадобится таблица дат (добавлена ​​новая таблица), а затем вам нужно будет выполнить внешнее соединение между этой таблицей и вашим запросом.

Этот вопрос также похож на другой вопрос. Ответы могут быть очень похожими.

Вставить даты в ответ на запрос, где их нет

0 голосов
/ 03 августа 2010

Поскольку не было простого способа сделать это, мне нужно было заполнить пробелы в заявке, а не возвращать в базу данных нужные данные.Я получаю удар по производительности за это, но это было необходимо для завершения отчета.

Я обязательно посмотрю, как получить этот возврат из базы данных в ближайшем будущем.Я попробую решение nonnb.

спасибо всем!

0 голосов
/ 01 августа 2010

Вам понадобится таблица дат для группировки.Это довольно просто в MSSQL с использованием CTE, например this - я не уверен, что MySQL имеет что-то подобное?В противном случае вам нужно будет создать жесткую таблицу как одноразовое упражнение

РЕДАКТИРОВАТЬ: попробуйте:

SELECT COUNT(pp.subscribe_date) AS counter, dl.date, MIN(pp.recur)
FROM date_lookup dl 
    LEFT OUTER JOIN paypal pp 
    on (pp.subscribe_date = dl.date AND pp.recur ='monthly') 
WHERE dl.date >= '2010-07-16' and dl.date <= '2010-07-23'
GROUP BY dl.date
ORDER BY dl.date
  • Тема запроса должна быть изменена натаблица date_lookup (порядок левого внешнего соединения становится важным)
  • Счетчик (*) не будет работать, поскольку запись «дата» всегда существует - нужно что-то подсчитать в таблице PayPay
  • pp.recur = 'month' теперь является условием соединения, а не фильтром из-за LOJ

Наконец, показ pp.recur в списке выбора не будет работать.

Я использовал агрегат, но MIN (pp.recur) вернет ноль, если нет записей PayPal

Что вы можете сделать, когда вы параметризируете свой запрос, это просто повторить RecurТип фильтра?Опять же, извините за синтаксис MSSQL

SELECT COUNT(pp.subscribe_date) AS counter, dl.date, @ppRecur
FROM date_lookup dl 
    LEFT OUTER JOIN paypal pp 
    on (pp.subscribe_date = dl.date AND pp.recur =@ppRecur) 
WHERE dl.date >= @DateFrom and dl.date <= @DateTo
GROUP BY dl.date
ORDER BY dl.date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...