如果Month和Year不存在行,则在子表中显示0计数

时间:2013-01-16 21:49:59

标签: sql-server sql-server-2000

我有两张表分销商和订单。我想获得每个月的订单数量(包括0个计数)我按照CustId月份和年份进行分组。 注意:客户端使用的是SQL 2000 :(

这就是我想要的

DistID   Month   Year   Orders
------------------------------
1        1       2012     4
1        2       2012     13
1        3       2012     5
2        1       2012     3
2        2       2012     0
2        3       2012     0
3        1       2012     8
3        2       2012     0
3        3       2012     3
4        1       2012     1
4        2       2012     0
4        3       2012     1
5        1       2012     6
5        2       2012     6
5        3       2012     0 

这就是我得到的

DistID   Month   Year   Orders
------------------------------
1        1       2012     4
1        2       2012     13
1        3       2012     5
2        1       2012     3
3        1       2012     8
3        3       2012     3
4        1       2012     1
4        3       2012     1
5        1       2012     6
5        2       2012     6

我知道为什么。这是因为Orders表中某些月份没有一行。如果该月份和年份的Orders表中没有任何行,是否可以将计数设为0?

这是我到目前为止所拥有的

SELECT 
D.DistID,
DATEPART(MONTH, Order_Date) AS [Month],
DATEPART(YEAR, Order_Date) AS [Year],
SUM(Total_PV) AS TotalPV,
COUNT(D.DistId) AS Orders

FROM Distributor D
LEFT OUTER JOIN Order O ON D.DistID = O.Distributor_ID                                           
WHERE DATEPART(YEAR, Order_Date) > 2005
GROUP BY DistID, DATEPART(MONTH, Order_Date), DATEPART(YEAR, Order_Date)  

感谢任何输入

1 个答案:

答案 0 :(得分:1)

您可以创建一个包含所有月份和年份的表格,例如:

create table MonthList(year int, month int);

如果您填写所有可用年份,则可以left join

select  o.distributor_id
,       ml.month
,       ml.year
,       sum(o.total_pv) as totalpv
,       count(d.distid) as orders
from    monthlist ml
left join 
        [order] o 
on      datepart(year, o.order_date) = ml.year
        and datepart(month, o.order_date) = ml.month
where   ml.year > 2005
group by 
        o.distributor_id
,       ml.month
,       ml.year

如果您不使用该表中的列,则无需加入Distributor