Sql查询以获取特定列的默认值为0

时间:2013-10-25 12:03:20

标签: sql-server

我遇到了查询问题。

我的查询是: -

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

提前致谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ;

答案 2 :(得分:0)

那么你可以做一个完整的外连接,它可以给你所有的客户,为缺少的数据重新调整null。然后,您可以选择ISNULL(NoOfOrders,0)来获得0而不是null。

我不是100&amp;确定这会奏效,但你可以尝试一下。