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

У меня есть следующая таблица

Id_ticket, date_ticket, office_ticket, status_ticket

Мне нужен запрос, чтобы вернуть меня на КАЖДЫЙ МЕСЯЦ, и всегда для одного и того же ОФИСА:

  • количество билетов (COUNT) с любым статусом
  • количество билетов (COUNT) со статусом = 5
  • количество билетов (COUNT) со статусом = 6
  • Месяц
  • Год

Запрос, который я сделал, чтобы вернуть ТОЛЬКО общее количество билетов с любым статусом, был таким. Это сработало!

SELECT
COUNT (id_ticket) as TotalTicketsPerMonth,
'sYear' = YEAR (date_ticket),
'sMonth' = MONTH (date_ticket)
FROM crm_vw_Tickets
WHERE office_ticket = 1
GROUP BY
YEAR (date_ticket), MONTH (date_ticket)
ORDER BY sYear ASC, sMonth ASC

Возврат общей суммы билета со статусом = 5

SELECT
COUNT (id_ticket) as TotalTicketsPerMonth,
'sYear' = YEAR (date_ticket),
'sMonth' = MONTH (date_ticket)
FROM crm_vw_Tickets
WHERE office_ticket = 1 AND status_ticket = 5
GROUP BY
YEAR (date_ticket), MONTH (date_ticket)
ORDER BY sYear ASC, sMonth ASC

Но мне нужно, чтобы возвращение было примерно таким:

Year Month Total Status5 Status6
2018   1     15      5        3

2018   2     14      4        5

2018   3     19      2        8

Спасибо за вашу помощь.

0
RGutierre 30 Май 2019 в 22:16

2 ответа

Лучший ответ

Вы близко. Вы можете использовать CASE выражение, чтобы получить то, что вам нужно:

SELECT
    COUNT (id_ticket) as TotalTicketsPerMonth,
    SUM(CASE WHEN status_ticket = 5 THEN 1 END) as Status5,
    SUM(CASE WHEN status_ticket = 6 THEN 1 END) as Status6,
    'sYear' = YEAR (date_ticket),
    'sMonth' = MONTH (date_ticket)
FROM crm_vw_Tickets
WHERE office_ticket = 1
GROUP BY YEAR (date_ticket), MONTH (date_ticket)
ORDER BY sYear ASC, sMonth ASC
1
JNevill 30 Май 2019 в 19:20

Следующий код основывается на ответе JNevill, включающем строки сводки для «пропущенных» месяцев, т. Е. Без билетов, а также месяцев с билетами. Основная идея состоит в том, чтобы создать таблицу всех месяцев от первого до последнего тикета, outer join данные тикета с месяцами, а затем суммировать данные. ( Таблица подсчета , таблица чисел и таблица календаря являются более или менее применимыми терминами.)

Это общее табличное выражение (CTE), которое содержит несколько запросов, которые шаг за шагом работают над результатом. Вы можете увидеть результаты промежуточных шагов, заменив последний оператор select одним из тех, что закомментированы над ним.

-- Sample data.
declare @crm_vw_Tickets as Table ( id_ticket Int Identity, date_ticket Date, office_ticket Int, status_ticket Int );
insert into @crm_vw_Tickets ( date_ticket, office_ticket, status_ticket ) values
  ( '20190305', 1, 6 ), -- Shrove Tuesday.
  ( '20190501', 1, 5 ), -- May Day.
  ( '20190525', 1, 5 ); -- Towel Day.
select * from @crm_vw_Tickets;

-- Summarize the data.
with
  -- Get the minimum and maximum ticket dates for   office_ticket   1.
  Limits as (
    select Min( date_ticket ) as MinDateTicket, Max( date_ticket ) as MaxDateTicket
      from @crm_vw_Tickets
      where office_ticket = 1 ),
  -- 0 to 9.
  Ten ( Number ) as ( select * from ( values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9) ) as Digits( Number ) ),
  -- 100 rows.
  TenUp2 ( Number ) as ( select 42 from Ten as L cross join Ten as R ),
  -- 10000 rows.  We'll assume that 10,000 months should cover the reporting range.
  TenUp4 ( Number ) as ( select 42 from TenUp2 as L cross join TenUp2 as R ),
  -- 1 to the number of months to summarize.
  Numbers ( Number ) as ( select top ( select DateDiff( month, MinDateTicket, MaxDateTicket ) + 1 from Limits ) Row_Number() over ( order by ( select NULL ) ) from TenUp4 ),
  -- Starting date of each month to summarize.
  Months as (
    select DateAdd( month, N.Number - 1, DateAdd( day, 1 - Day( L.MinDateTicket ), L.MinDateTicket ) ) as StartOfMonth
      from Limits as L cross join
        Numbers as N ),
  -- All tickets assigned to the appropriate month and a row with NULL ticket data
  --   for each month without tickets.
  MonthsAndTickets as (
    select M.StartOfMonth, T.*
      from Months as M left outer join
        @crm_vw_Tickets as T on M.StartOfMonth <= T.date_ticket and T.date_ticket < DateAdd( month, 1, M.StartOfMonth ) )
  -- Use one of the following   select   statements to see the intermediate or final results:
  --select * from Limits;
  --select * from Ten;
  --select * from TenUp2;
  --select * from TenUp4;
  --select * from Numbers;
  --select * from Months;
  --select * from MonthsAndTickets;
  select Year( StartOfMonth ) as SummaryYear, Month( StartOfMonth ) as SummaryMonth,
    Count( id_ticket ) as TotalTickets,
    Coalesce( Sum( case when status_ticket = 5 then 1 end ), 0 ) as Status5Tickets,
    Coalesce( Sum( case when status_ticket = 6 then 1 end ), 0 ) as Status6Tickets
    from MonthsAndTickets
    where office_ticket = 1 or office_ticket is NULL -- Handle months with no tickets.
    group by StartOfMonth
    order by StartOfMonth;

Обратите внимание, что в финале select используются Count( id_ticket ), Coalesce и явная проверка NULL для получения соответствующих выходных значений (0) в течение нескольких месяцев без билетов.

0
HABO 31 Май 2019 в 12:15