2010-08-01 245 views
4

我一直在抨击我的头一阵子,所以现在我在这里:)我是一个SQL初学者,所以也许这对你们来说很容易...MySQL:如果行不存在,则返回0

我有这个疑问:

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 它是同样的问题 – 2010-08-01 11:04:04

回答

0

您将需要一个日期表来进行分组。这在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 ='monthly'现在是一个加入cond ition,而不是过滤器,因为LOJ

最后,在选择列表中显示pp.recur不起作用。

我用的集合,但是如果没有贝宝记录

当你参数化查询是重复刚才的复发类型过滤你可以做什么MIN(pp.recur)将返回null? 再次,PLZ借口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 PP LEFT OUTER JOIN上date_lookup DL(pp.subscribe_date = dl.date) WHERE pp.recur = 'monthly'和pp.subscribe_date>“2010-07-16” and pp.subscribe_date <“2010-07-23” GROUP BY pp.subscribe_date ORDER BY pp.subscribe_date 我仍然得到相同的结果:( – Loony2nz 2010-08-01 11:51:25

+0

已经在上面编辑过了,FWIW在MSSQL上工作;) – StuartLC 2010-08-01 17:16:06

0

由于没有简单的方法来做到这一点,我必须有应用填补空白,为我而不是让数据库返回我想要的数据。我确实得到了这个表现,但这是完成报告所必需的。

我一定会考虑在不久的将来让我从数据库中获得这个回报。我会试试nonnb的解决方案。

感谢大家!

相关问题