Sql server 如果月份和年份不存在行,则SQL在子表中显示0计数

Sql server 如果月份和年份不存在行,则SQL在子表中显示0计数,sql-server,sql-server-2000,Sql Server,Sql Server 2000,我有两张桌子和两份订单。我想得到每个月的订单数量(包括0个数量),我是按客户ID的月份和年份分组的。 注意:客户端正在使用SQL 2000:( 这就是我想要的 DistID Month Year Orders ------------------------------ 1 1 2012 4 1 2 2012 13 1 3 2012 5 2 1 2012

我有两张桌子和两份订单。我想得到每个月的订单数量(包括0个数量),我是按客户ID的月份和年份分组的。 注意:客户端正在使用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
我知道为什么。这是因为订单表中没有特定月份的行。如果订单表中没有该月份和年份的行,有没有办法将计数设为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)  

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

create table MonthList(year int, month int);
如果用所有可用年份填充,则可以
左键加入

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

如果不使用该表中的列,则无需加入分销商。

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

create table MonthList(year int, month int);
如果用所有可用年份填充,则可以
左键加入

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

如果您不使用该表中的列,则无需加入分销商。

谢谢您的回复。是的,我需要分销商,因为我需要说明表中的每个分销商。因此0订单。:)还有其他想法吗?这真让我烦透了。我想这对一个SQL的家伙来说是非常直截了当的。这是否更适合SQL论坛?谢谢谢谢你的回复。是的,我需要分销商,因为我需要说明表中的每个分销商。因此,订单数量为0。:)还有什么想法吗?这真让我烦透了。我想这对一个SQL的家伙来说是非常直截了当的。这是否更适合SQL论坛?谢谢