我遇到了查询问题。
我的查询是: -
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 :(得分: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;确定这会奏效,但你可以尝试一下。