2010-08-01 2 views
4

Я некоторое время бил головой об этом, так что теперь я здесь :) Я начинающий SQL, так что, возможно, это будет легко для вас, ребята ...MySQL: Return 0, если строка doen't существует

у меня есть этот запрос:

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 

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

+2

не так прост, как вы думаете, но смотрите так: http://stackoverflow.com/questions/373490/insert-dates-in-the-return-from-a-query-where-there-is -none/373734 # 373734 эта же проблема –

ответ

0

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

EDIT: Дайте это попробовать:

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 (порядок левой наружной связи становится важным)
  • Count (*) не будет работать, так как запись «дата» всегда существует - нужно что-то считать в таблице PayPay
  • pp.recur = 'ежемесячно' теперь присоединяется ition, а не фильтр из-за LOJ

И, наконец, показ pp.recur в списке выбора не сработает.

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

Что вы можете сделать, когда вы параметризировать ваш запрос просто повторить повторялись Тип фильтра? Опять же, плз извинить синтаксис 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 [email protected]) 
WHERE dl.date >= @DateFrom and dl.date <= @DateTo 
GROUP BY dl.date 
ORDER BY dl.date 
+0

Хорошо .. Я принял ваш совет и создал таблицу date_lookup. Имеет один столбец, и каждый день года в нем. Вот мой новый запрос: SELECT COUNT (*) AS счетчик, pp.recur, dl.date ОТ PAYPAL С. LEFT OUTER JOIN date_lookup дл на (pp.subscribe_date = dl.date) WHERE pp.recur = 'ежемесячно' и pp.subscribe_date> "2010-07-16" и pp.subscribe_date < "2010-07-23" GROUP BY pp.subscribe_date ORDER BY pp.subscribe_date Я все еще получаю тот же результат :( – Loony2nz

+0

Редактировали: FWIW работает над MSSQL;) – StuartLC

0

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

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

Insert Dates in the return from a query where there is none

0

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

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

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

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