2011-03-15 72 views
0

我正在使用SQL Server 2005并试图以某些格式获取某些统计数据,因为它被加载到不应该更改的图形中。SQL统计谜语

图表加入日期,类型和总和。在我的案例中输入域名,总和是这个网站每天售出多少。

现在我有两个数据库表UsersSalesUsersuserIDregistrationSite列。 Sales得到saleID,userIDsum。这是查询我得到我的统计信息有一个问题的所有细节。

即使在此日期没有出售此域以使图工作,我应该在选择中获得“0”值。有没有办法做到这一点?

select 
    sum(s.sum) sum,u.registrationSite, 
    dateadd(dd, datediff(dd, 0, s.date), 0) date 
from Users u 
right join Sales s on u.userid=s.userid 
where 
    s.date > dateadd(mm, -1, getdate()) 
group by 
    registrationSite,dateadd(dd,datediff(dd,0,s.date),0) 
order by 
    dateadd(dd, datediff(dd, 0, s.date), 0) 
+0

你需要一个外部联接到一个日期表(或数表,你作为一个日期表用)填写缺少的日期。 – 2011-03-15 09:39:01

+0

@马丁,你是什么意思?你的意思是创建日期表和外部连接到它的“on子句”? – eugeneK 2011-03-15 09:41:59

+0

我相信马丁意味着将你的'right join'改为'full outer join'。 – 2011-03-15 10:10:59

回答

1

也许这是你正在寻找的这个输出,或者你可以修改ti得到你想要的。

cteDates建立从今天到一个月的日期列表。针对distinct RegistrationSite的交叉连接可确保您为每个日期和网站组合获得一行。销售的left outer join获得每个日期/网站行的总和。

;with cteDates as 
(
    select dateadd(dd, datediff(dd, 0, getdate()), 0) as [Date] 
    union all 
    select dateadd(dd, -1, [Date]) as [Date] 
    from cteDates 
    where [Date] > dateadd(mm, -1, getdate()) 
) 
select 
    sum(coalesce(s.[Sum], 0)) as [Sum], 
    r.RegistrationSite, 
    cd.[Date] 
from cteDates as cd 
    cross join (select distinct RegistrationSite 
       from Users) as r 
    left outer join 
     (select [Date], [sum], RegistrationSite 
     from Sales 
     inner join Users 
      on Sales.UserID = Users.UserID) as s 
    on cd.[Date] = dateadd(dd, datediff(dd, 0, s.[Date]), 0) and 
     r.RegistrationSite = s.RegistrationSite 
group by r.RegistrationSite, cd.[Date] 
order by cd.[Date] 

结果

0   site 1   2011-03-12 00:00:00.000 
0   site 2   2011-03-12 00:00:00.000 
0   site 1   2011-03-13 00:00:00.000 
0   site 2   2011-03-13 00:00:00.000 
60   site 1   2011-03-14 00:00:00.000 
50   site 2   2011-03-14 00:00:00.000 
0   site 1   2011-03-15 00:00:00.000 
40   site 2   2011-03-15 00:00:00.000 
+0

感谢它的工作原理,我试图避免与日历混乱,但似乎这是目前唯一的选择... – eugeneK 2011-03-15 11:16:52