SQL Server Создание выходной таблицы с диапазонами - PullRequest
0 голосов
/ 31 мая 2018

У меня есть следующий запрос:

select a.ID, a.Date_Reported AS [Date Sent to X],  b.Date_Received AS [Date Returned from X], 

(datediff(dd, a.date_reported, b.date_received) 
      + CASE WHEN Datepart(dw, b.date_received) = 7 THEN 1 ELSE 0 END 
       - (Datediff(wk, a.date_reported, b.date_received) * 2 ) 
       - CASE WHEN Datepart(dw, b.date_received) = 1 THEN 1 ELSE 0 END + 
       - CASE WHEN Datepart(dw, b.date_received) = 1 THEN 1 ELSE 0 
       END) AS [Time_Spent]

from Tx_Ex a 
join Tx b on b.id = a.id

Просто запрос выполняет поиск разницы в рабочих днях между двумя датами (Дата получения - Дата отчета) в двух таблицах.

Я хочу настроить запрос так, чтобы мой вывод выглядел следующим образом:

Time Taken (days) | 0-3 | 4 | 5 | 6-8 | 9+ | less than 0 days
Count             |  2  | 1 | 2 | 1   | 1  | 3
%                 | 20  | 10| 20| 10  | 10 | 30

Итак, я просто добавил фиктивные значения для count и%, чтобы лучше понять, чего я хочу.По сути, я хочу, чтобы вышеуказанный запрос был изменен, поэтому у меня есть вышеуказанные диапазоны, а также две другие строки с количеством и%.

Пример из приведенной выше таблицы, запрос скажет мне, что есть 2 случая, когда разница вдве даты попадают в диапазон 0-3 и, следовательно, 20% от общего числа.Кроме того, есть случаи (из-за ошибок), когда время может быть отрицательным (т. Е. Сообщаемая дата на самом деле позже, чем полученная дата), поэтому я добавил, что «диапазон меньше 0».

Пожалуйста, дайтея знаю, если что-то неясно.

1 Ответ

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

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

with t as (
      <your query here>
     )
select sum(case when time_spent < 0 then 1 else 0 end) as days_lt_0,
       sum(case when time_spent between 0 and 3 then 1 else 0 end) as days_0_3,
       sum(case when time_spent 4 then 1 else 0 end) as days_4,
       sum(case when time_spent 5 then 1 else 0 end) as days_5,
       sum(case when time_spent between 6 and 8 then 1 else 0 end) as days_6_38,
       sum(case when time_spent >= 9 then 1 else 0 end) as days_9pl,
       avg(case when time_spent < 0 then 1.0 else 0 end) as ratio_lt_0,
       avg(case when time_spent between 0 and 3 then 1.0 else 0 end) as ratio_0_3,
       avg(case when time_spent 4 then 1.0 else 0 end) as ratio_4,
       avg(case when time_spent 5 then 1.0 else 0 end) as ratio_5,
       avg(case when time_spent between 6 and 8 then 1.0 else 0 end) as ratio_6_38,
       avg(case when time_spent >= 9 then 1.0 else 0 end) as ratio_9pl
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...