2013-10-25 65 views
0

我正面临查询问题。SQL查询以获取特定列的默认值为0

我的查询是: -

SELECT MONTH(o.OrderDate) as MonthValue, 
     YEAR(o.OrderDate) as YearValue, 
     C.CustomerTypeID, Count(o.Total) as NoOfOrders 
FROM Orders o   
RIGHT JOIN Customers C on C.CustomerID = o.CustomerID  

WHERE o.OrderDate >= CONVERT(DATETIME, '1/1/2013 00:00:00 AM') 
AND o.OrderDate <= CONVERT(DATETIME, '12/31/2013 23:59:59 PM') 
GROUP BY MONTH(o.OrderDate), 
     YEAR(o.OrderDate), 
     C.CustomerTypeID 
ORDER BY MONTH(o.OrderDate), 
     YEAR(o.OrderDate), 
     C.CustomerTypeID 

这是给结果如下: -

MonthValue YearValue CustomerTypeID NoOfOrders 
1    2013   1    10 
1    2013   2    20 
1    2013   3    45 
2    2013   1    45 
2    2013   2    45 
3    2013   1    88 
3    2013   2    56 
3    2013   3    89 

至于第2个月,客户类型3有没有结果,所以没有出现在结果。

但我想显示“0”作为其默认的结果,如下图所示: -

2    2013   3    0 

在此先感谢。

+0

你有没有尝试过左联接,以获得行显示和ISNULL来处理空值? – Brandon

+0

感谢@Brandon快速重播,但没有NULL值,因为客户类型3在2个月内没有任何订单,所以它不会出现在结果中。 – AnandMeena

+0

您的'RIGHT JOIN'没有意义,因为订单应属于客户,对吧?您是否试过'LEFT JOIN',也就是说,应该显示一个客户是否有订单,而没有订单的客户将有0作为NoOfOrders? – Edper

回答

4

试试这个:

SELECT 2013 as [Year], 
     months.number, 
     Amount = SUM(COALESCE(o.Total,0)), 
     C.CustomerType 
FROM Customers C 
CROSS JOIN 
(SELECT number FROM master..spt_values WHERE type='p' and number between 1 and 12) months 
LEFT JOIN [Orders] o on C.CustomerId = o.CustomerId and YEAR(o.OrderDate) = 2013 and MONTH(o.OrderDate) = months.number 
GROUP BY months.number, C.CustomerType 
ORDER BY months.number, C.CustomerType 
+0

谢谢@Nisarg,它工作正常,我看起来挣扎从4个小时,谢谢你是冠军:-) – AnandMeena

+0

现在,如果想获得一年的52周数据比?你可以帮我吗? – AnandMeena

+0

需要检查周明智,我会尽快回复你。 –

0

那么你可以做一个完整的外部联接,它应该会给你所有的客户,为缺失的数据重新调用null。然后你可以选择ISNULL(NoOfOrders,0)来得到0而不是null。

我不是100 &当然可以,但你可以试一试。

1

编辑:你必须外部连接所有月份获取缺少的条目。因此为了获得最佳可读性,请先交叉所有客户和月份,然后再外部加入订单。

SELECT all_months.MonthValue, 
     all_months.YearValue, 
     C.CustomerTypeID, 
     Count(o.Total) as NoOfOrders 
FROM 
(
    SELECT distinct MONTH(OrderDate) as MonthValue, YEAR(OrderDate) as YearValue 
    FROM orders 
    WHERE YEAR(OrderDate) = 2013 
) all_months   
CROSS JOIN Customers C 
LEFT OUTER JOIN Orders o 
    ON o.CustomerID = C.CustomerID 
    AND MONTH(o.OrderDate) = all_months.MonthValue 
    AND YEAR(o.OrderDate) = all_months.YearValue 
GROUP BY all_months.MonthValue, 
     all_months.YearValue, 
     C.CustomerTypeID 
ORDER BY all_months.MonthValue, 
     all_months.YearValue, 
     C.CustomerTypeID ; 
+0

感谢@Thorsten,但它给错误,请参阅http://www.evernote.com/shard/s364/sh/afc7e4f5-7c6e-4ceb-9d3d-1a868e4d9a33/a9b7f89a2f03e3caae6079a8eb48f21a – AnandMeena

+1

对不起,我并没有花太多时间写这个,所以它出来相当sl。。我已经写了一遍,所以它现在应该有希望工作。 –

+0

谢谢@Thorsten :-),现在工作正常。我们能得到一年52周的数据吗? – AnandMeena