Запрос одного и того же столбца для 3 разных значений - PullRequest
0 голосов
/ 30 мая 2019

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

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

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

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

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Вы рядом.Вы можете использовать выражение 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
0 голосов
/ 31 мая 2019

Следующий код основывается на ответе 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) для месяцев без билетов.

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