Получение отсчета временных интервалов - PullRequest
2 голосов
/ 01 сентября 2011

У меня есть таблица с именем Call_Data, и данные выглядят так:

Arr_Date      Interval    AN_Time    AB_Time
08/08/2011    1600        113        NULL
08/08/2011    1400        317        NULL
08/09/2011    1200        298        NULL
08/09/2011    1000        NULL       194
08/10/2011    1200        256        NULL
08/10/2011    1400        NULL       132

Я хочу получить вывод как:

Arr_Date    Total_calls  AN_10_min   AN_5_min   AB_10_Min     AB_5_min
08/08/2011   2             2            1             0           0
08/09/2011   2             1            1             1           1
08/10/2011   2             1            1             1           1

Логика - это столбец AN_Time, AB_Time в секундах. Я хочу посчитать количество вызовов в день, которые находятся в пределах 10 минут и 5 минут для каждого столбца.

Я написал что-то вроде этого:

SELECT  ARR_date,
CASE WHEN AN_TIME <300 THEN 1 ELSE 0 END AS AN_5_min ,
case WHEN AN_TIME <600 THEN 1 ELSE 0 END AS AN_10_min,
CASE WHEN AB_TIME <300 THEN 1 ELSE 0 END AS AB_5_min ,
case WHEN AB_TIME <600 THEN 1 ELSE 0 END AS AB_10_min
FROM Call_Data
GROUP BY AR_Date,AN_TIME,AB_TIME

Но это не радует меня общим количеством звонков. Кто-нибудь может мне помочь?

Ответы [ 3 ]

3 голосов
/ 01 сентября 2011

Вы были близки:

SELECT  
  ARR_date,
  COUNT(*)  AS Total_calls,
  SUM( CASE WHEN AN_TIME <300 THEN 1 ELSE 0 END )  AS AN_5_min ,
  SUM( CASE WHEN AN_TIME <600 THEN 1 ELSE 0 END )  AS AN_10_min,
  SUM( CASE WHEN AB_TIME <300 THEN 1 ELSE 0 END )  AS AB_5_min ,
  SUM( CASE WHEN AB_TIME <600 THEN 1 ELSE 0 END )  AS AB_10_min
FROM Call_Data
GROUP BY AR_Date

Вы также можете использовать NULL и COUNT, чтобы показать (любому будущему кодировщику), что вы действительно считаете звонки и не суммируете:

SELECT  
  ARR_date,
  COUNT(*)  AS Total_calls,
  COUNT( CASE WHEN AN_TIME <300 THEN 1 ELSE NULL END )  AS AN_5_min ,
  COUNT( CASE WHEN AN_TIME <600 THEN 1 ELSE NULL END )  AS AN_10_min,
  COUNT( CASE WHEN AB_TIME <300 THEN 1 ELSE NULL END )  AS AB_5_min ,
  COUNT( CASE WHEN AB_TIME <600 THEN 1 ELSE NULL END )  AS AB_10_min
FROM Call_Data
GROUP BY AR_Date
2 голосов
/ 01 сентября 2011

Вы почти у цели, просто сложите столбцы

SELECT
    ARR_date,
    SUM(AN_5_min) AN_5_min,
    SUM(AN_10_min) AN_10_min,
    SUM(AB_5_min) AB_5_min,
    SUM(AB_10_min) AB_10_min
FROM
    (SELECT 
        ARR_date,
        CASE WHEN AN_TIME <300 THEN 1 ELSE 0 END AS AN_5_min,
        case WHEN AN_TIME <600 THEN 1 ELSE 0 END AS AN_10_min,
        CASE WHEN AB_TIME <300 THEN 1 ELSE 0 END AS AB_5_min,
        case WHEN AB_TIME <600 THEN 1 ELSE 0 END AS AB_10_min
    FROM
        Call_Data) TBL
GROUP BY
    ARR_date
1 голос
/ 01 сентября 2011
SELECT Arr_Date, COUNT(*) AS Total_Calls,
  SUM(CASE WHEN AN_TIME <300 THEN 1 ELSE 0 END) AS AN_5_min ,
  SUM(case WHEN AN_TIME <600 THEN 1 ELSE 0 END) AS AN_10_min,
  SUM(CASE WHEN AB_TIME <300 THEN 1 ELSE 0 END) AS AB_5_min ,
  SUM(case WHEN AB_TIME <600 THEN 1 ELSE 0 END) AS AB_10_min
FROM dbo.Call_Data
GROUP BY Arr_Date
ORDER BY Arr_Date;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...