SQL - получить данные между двумя датами, сгруппированными по неделям - PullRequest
0 голосов
/ 08 мая 2018

Этот вопрос мог быть решен много раз или даже задан много раз.Но так как я не разбираюсь в SQL, я не могу понять, что можно найти в Интернете.Как будто я не могу настроить запросы из Интернета для своих нужд.И тут мне нужно

У меня есть таблица с именем Orders, содержащая такие поля, как OrderId, OrderDate и т. Д.

Мне нужно сгенерировать лист Excel,Лист будет иметь количество заказов, сгруппированных по неделям.(Например, сколько заказов было сделано за эту неделю)

Пользователь может выбрать год, за который ему / ей нужен отчет.

Так что, если пользователь выбирает текущий год, мне нужносоздать отчет в формате Excel, содержащий данные с 1 января по сегодняшний день, сгруппированные по неделям.

Если пользователь выбирает любой другой год (возможно, предыдущие годы), то мне нужно создать отчет, содержащий все данные за этот год, сгруппированные по неделям..

В настоящее время я ищу запрос SQL, который возвращает такие данные (ожидаемый результат)

Week    Date Range               Total No of Orders
-----+--------------------------+-------------------
week#1  2018-01-01 - 2018-01-07     10 
week#2  2018-01-08 - 2018-01-14     0
week#3  2018-01-15 - 2018-01-21     1

Как мне написать запрос для достижения того же самого?

Нужна консультация специалиста ...

1 Ответ

0 голосов
/ 08 мая 2018

Вам нужно использовать рекурсивную CTE запись календаря по номеру недели, затем Orders LEFT JOIN в таблице календаря CTE получить COUNT.

Примечание:

  • переменная @Dt укажите, какой год вы хотите начать.

Запрос выглядит следующим образом.

DECLARE @Dt date = '2018-01-01' 

;WITH CTE(Dt,maxD) AS (
  SELECT DATEPART(ww,@Dt) Dt, DATEPART(ww,MAX(OrderDate)) maxD
  FROM Orders
  UNION ALL 
  SELECT (Dt +1) Dt,maxD
  FROM CTE
  WHERE (Dt +1) <= maxD
)
SELECT CONCAT('week#',c.Dt) 'week',
       CONCAT(
         CONVERT(char(10),dateadd(week,c.Dt-1, DATEADD(wk, DATEDIFF(wk,-1,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)), 0)),126)
         ,'-'
         , CONVERT(char(10),dateadd(week,c.Dt, DATEADD(wk, DATEDIFF(wk,-1,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)), 0)),126)) 'Date Range',
       COUNT(o.OrderDate) 'Total No of Orders'
FROM CTE c 
LEFT JOIN Orders o on c.Dt = DATEPART(ww,o.OrderDate)
GROUP BY c.Dt

sqlfiddle: http://sqlfiddle.com/#!18/8f089/40

...