Sql статистическая загадка - PullRequest
0 голосов
/ 15 марта 2011

Я использую SQL Server 2005 и пытаюсь получить некоторые статистические данные в определенном формате, потому что они загружены в графики, которые не должны быть изменены.

График принимает дату, тип и сумму. Введите в моем случае имя домена, и сумма - это сколько было продано за этот сайт в день.

Теперь у меня есть две таблицы БД, Users и Sales. Users имеет userID и registrationSite столбцы. Sales получил saleID, userID и sum. По этому запросу я получаю все детали моей статистики с одной проблемой.

Я должен получить значение "0" в select, даже если в этот день не было продажи этого домена, чтобы график работал. Есть ли способ сделать это?

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)

1 Ответ

1 голос
/ 15 марта 2011

Возможно, именно этот результат вы ищете, или вы можете изменить его, чтобы получить именно то, что вы хотите.

cteDates создает список дат с сегодняшнего дня и месяца назад.Перекрестное объединение против distinct RegistrationSite гарантирует, что вы получите одну строку для каждой комбинации даты и сайта.left outer join to sales получает сумму для каждой строки даты / сайта.

;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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...