Получить количество заказов, созданных ежемесячно - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь перечислить общее количество заказов за последние 12 месяцев (не включая текущий месяц).

Это мой запрос:

Select
Year(CreatedOn)*100+Month(CreatedOn) YearMonth,
Count(*) OrderCount
From Orders
Where DateDiff(MM,CreatedOn,GetUTCDate()) Between 1 And 12
Group By Year(CreatedOn), Month(CreatedOn)
Order By YearMonth

Как и ожидалосьЯ правильно получаю результаты. Однако, если в определенном месяце нет заказов, месяц полностью исключается из результата. Я хотел бы показать этот месяц с 0. См. Пример результата:

201809  70
201810  8
201811  53
201812  67
201901  15
201902  13
201903  10
201905  12
201908  9

См. Отсутствующие месяцы 201904, 201906 и 201907. Всего должно быть 12 строк.

Запросдолжен выполняться в подзапросе с использованием For XML Path, чтобы я мог получить список заказов через запятую за последние 12 месяцев.

Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 29 сентября 2019

Вам нужно сгенерировать строки, которые вы хотите как-то. Один метод использует рекурсивный CTE:

with dates as (
      select Year(getdate())*100+Month(getdate()) as yearmonth,
             1 as n, datefromparts(year(getdate()), month(getdate()), 1) as yyyymm
      union all
      select year(dateadd(month, -1, yyyymm)) * 100 + month(dateadd(month, -1, yyyymm),
             n + 1,
             dateadd(month, -1, yyyymm)
      from cte
      where n < 12
     ),
     q as (
      <your query here>
     )
select d.yearmonth, coalesce(q.orders, 0) as orders
from dates d left join
     q
     on d.yearmonth = q.yearmonth;
1 голос
/ 29 сентября 2019

Проверьте это-

WITH R(N) AS
(
    SELECT 1
    UNION ALL
    SELECT N+1 
    FROM R
    WHERE N < 12
)
SELECT REPLACE(LEFT(CAST (DATEADD(MONTH,DATEDIFF(MONTH,0,(DATEADD(MONTH,-N,GetUTCDate()))),0) AS DATE),7),'-','') AS [YearMonth],ISNULL(o.OrderCount,0) as OrderCount 
FROM R A
LEFT JOIN 
(       
    Select
    Year(CreatedOn)*100+Month(CreatedOn) YearMonth,
    Count(*) OrderCount
    From Orders
    Where DateDiff(MM,CreatedOn,GetUTCDate()) Between 1 And 12
    Group By Year(CreatedOn), Month(CreatedOn)
) O ON O.YearMonth=REPLACE(LEFT(CAST (DATEADD(MONTH,DATEDIFF(MONTH,0,(DATEADD(MONTH,-N,GetUTCDate()))),0) AS DATE),7),'-','')
Order By REPLACE(LEFT(CAST (DATEADD(MONTH,DATEDIFF(MONTH,0,(DATEADD(MONTH,-N,GetUTCDate()))),0) AS DATE),7),'-','');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...