Как получить данные за последние 7 дней с сегодняшнего дня в SQL Server - PullRequest
0 голосов
/ 05 октября 2018

У меня есть DataEntry Table с именем GuestAddressData(UserId INT, EDate DateTime) с данными пользователя.Мне нужно получить количество пользователей за сегодня за предыдущие 7 дней .Мой запрос:

SELECT 
  row_number() over (order by (SELECT 1)) ID,
  count(*) Total,
  LEFT(Datename(weekday, Cast(EDate as date)), 3) Day
FROM 
  CRM0001GuestAddressData
WHERE
  EDate >= dateadd(week, datediff(d, -1, getdate()-2)/7, -1)
GROUP BY
  Cast(EDate as date)
ORDER BY
  Cast(EDate as date)

Например, если сегодня пятница, то мой ожидаемый результат:

ID   |   TOTAL  |   DAY
------------------------
1    |    78    |   Sat
2    |    23    |   Sun
3    |    54    |   Mon
4    |    17    |   Tues
5    |    56    |   Wed
6    |    45    |   Thus
7    |    78    |   Fri  -  Today

, но это не правильно.Как это решить?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Вы можете «сгенерировать» список из семи чисел и использовать его для построения желаемых дат.Затем оставьте соединение с вашими данными, чтобы получить количество, включая нули:

WITH datelist(num, a, b) AS (
    SELECT num, DATEADD(DAY, -num, CAST(CURRENT_TIMESTAMP AS DATE)), DATEADD(DAY, -num + 1, CAST(CURRENT_TIMESTAMP AS DATE))
    FROM (VALUES (0), (1), (2), (3), (4), (5), (6)) AS v(num)
)
SELECT 7 - num AS ID, datelist.a AS Day, COUNT(IDBooking)
FROM datelist
LEFT JOIN T_Bookings ON Opened >= datelist.a AND Opened < datelist.b
GROUP BY datelist.a, datelist.num
ORDER BY datelist.a
0 голосов
/ 05 октября 2018
SELECT 
  row_number() over (order by dDate) ID,
  cnt,
  LEFT(Datename(weekday, dDate), 3) Day
from
(Select cast(EDate as Date) as dDate,
       count(*) as cnt
FROM (values (0),(1),(2),(3),(4),(5),(6)) t(v)
  inner join
  CRM0001GuestAddressData gd on datediff(d, gd.Edate, getdate()) = t.v 
WHERE
  EDate >= dateadd(d, -6, cast(getdate() as date)) and EDate < dateadd(d,1,cast(getdate() as date))
GROUP BY
  Cast(EDate as date)) tmp;

Примечание: Вы хотели получить 7 дней со вчерашнего дня, верно?Неважно, исправлено на основе вашего образца.

Демо DBFiddle

РЕДАКТИРОВАТЬ: Имея все дни:

SELECT 
  row_number() over (order by dDate) ID,
  cnt,
  LEFT(Datename(weekday, dDate), 3) Day
from
(Select dateadd(d,-v,cast(getdate() as date)) as dDate,
       count(Edate) as cnt
FROM (values (0),(1),(2),(3),(4),(5),(6)) t(v)
  left join
  CRM0001GuestAddressData gd on Datediff(d,gd.EDate, getdate()) = t.v 
GROUP BY
  dateadd(d,-v,cast(getdate() as date))) tmp;

DBFiddle Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...