Запрос работает подсчет открытых вопросов в данный день - PullRequest
0 голосов
/ 20 сентября 2018

Я уже давно бьюсь об этом, и думаю, что сейчас я сильно усложнил ситуацию.У меня есть таблица, содержащая поля

  • OpenDate
  • ClosedDate
  • Клиент
  • Контракт
  • Сервис

Что мне нужно, чтобы превратить это в

  • Дата
  • Клиент
  • Контракт
  • Сервис
  • OpenedOnThisDay
  • OpenedYeterday
  • ClosedOnThisDay
  • ClosedYesterday
  • OpenAtStartOfTuture
  • OpenAtStartOfToday
1038 *1037* 1038, могут быть или не быть какие-либо вопросы, открытые или закрытые в этот день.Этот день все еще должен быть включен с 0

Я пришел к этому несколькими способами и могу дать один из желаемых результатов за раз (открыт, закрыт, открыт в конце), но я не могуполучить их все сразу, по крайней мере, без экспоненциального увеличения времени запроса.

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

Открыт

select Cast(EntryDateTime as Date) as DateStamp
  ,ContractNumber
  ,Client
  ,services.Service
  ,sum(1) as Count
  ,lag(sum(1)) OVER (
    partition by tickets.ContractNumber
    ,services.Service ORDER BY Cast(EntryDateTime as Date) ASC
    ) as CountDayBefore
from v_JiraImpactedServices as services
LEFT JOIN v_JiraTickets as tickets ON services.ticketnumber = tickets.TicketNumber
WHERE tickets.Client is not null
  AND tickets.TicketNumber IS NOT NULL
  and tickets.ContractNumber is not null
GROUP BY Cast(tickets.EntryDateTime as Date)
  ,tickets.ContractNumber
  ,tickets.Client
  ,services.Service;

Закрыт

select Cast(ResolvedDateTime as Date) as DateStamp
  ,ContractNumber
  ,Client
  ,services.Service
  ,sum(1) as Count
  ,lag(sum(1)) OVER (
    partition by tickets.ContractNumber
    ,services.Service ORDER BY Cast(ResolvedDateTime as Date) ASC
    ) as CountDayBefore
from v_JiraImpactedServices as services
LEFT JOIN v_JiraTickets as tickets ON services.ticketnumber = tickets.TicketNumber
WHERE tickets.Client is not null
  and tickets.TicketNumber is not null
  AND tickets.ContractNumber is not null
GROUP BY Cast(tickets.ResolvedDateTime as Date)
  ,tickets.ContractNumber
  ,tickets.Client
  ,services.Service;

Открыто Вкл.

SELECT calendar.FullDate as DateStamp
  ,tickets.ContractNumber
  ,tickets.client
  ,services.Service
  ,IsNull(count(tickets.TicketNumber), 0) as Count
  ,IsNull(lag(count(tickets.TicketNumber), 1) OVER (
      partition by tickets.ContractNumber
      ,services.Service Order By FullDate ASC
      ), 0) as CountDayBefore
FROM v_Calendar as calendar
LEFT JOIN v_JiraTickets as tickets ON Cast(tickets.EntryDateTime as Date) <= calendar.FullDate
  AND (
    Cast(tickets.ResolvedDateTime as Date) > calendar.FullDate
    OR tickets.ResolvedDateTime is null
    )
LEFT JOIN v_JiraImpactedServices as services ON services.ticketnumber = tickets.TicketNumber
WHERE tickets.Client is not null
  AND tickets.ContractNumber is not null
GROUP BY calendar.FullDate
  ,tickets.ContractNumber
  ,tickets.Client
  ,services.Service;

Как я уже говорил, каждый из них сам по себе дает ПОЧТИ желаемые результаты, но пропускает дни со значениями 0.

Помимо дней производствас 0 значениями мне нужно также объединить их в один результат таблицы.Все попытки до настоящего времени либо приводили к явно неверным результатам JOIN, либо выполнялись в течение часа.

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

1 Ответ

0 голосов
/ 21 сентября 2018

Просто чтобы дать вам представление, хотя имена полей не соответствуют вашему сценарию, вот как я бы подошел к этому:

WITH 
    SourceData (ClientID, ContractID, ServiceID, DateStamp) AS (
        SELECT a.ID, b.ID, c.ID, d.DateStamp
        FROM clients a
            JOIN contracts b ON a.ID = b.ClientID
                JOIN [services] c ON b.ID = c.ContractID
        CROSS JOIN calendar d
        WHERE d.DateStamp >= DATEADD(day, -60, GETDATE())
    )
SELECT d.DateStamp, s.ClientID, s.ContractID, s.ServiceID
  , COUNT(CASE WHEN Cast(EntryDateTime as Date) = d.DateStamp THEN 1 END) AS OpenedOn
  , COUNT(CASE WHEN Cast(ResolvedDateTime as Date) = d.DateStamp THEN 1 END) AS ClosedOn
  , COUNT(CASE WHEN Cast(ResolvedDateTime as Date) > d.DateStamp OR ResolvedDateTime IS NULL AND EntryDateTime IS NOT NULL THEN 1 END) AS InProgress
FROM SourceData s 
  LEFT JOIN tickets t
  ON  s.ClientID = t.ClientID
  AND s.ContractID = t.ContractID
  AND s.ServiceID = t.ServiceID
  AND s.DateStamp >= Cast(EntryDateTime as Date)
  AND (s.DateStamp <= ResolvedDateTime OR ResolvedDateTime IS NULL)
GROUP BY d.DateStamp, s.ClientID, s.ContractID, s.ServiceID
...