SQL Сервер: Группировка по одному полю в объединенной таблице с сохранением результатов NULL. - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь объединить 2 таблицы и ограничить вывод правой таблицы на основе поля ob. [Type]. Сначала я пытался сохранить значения NULL для левого объединения, но затем я прочитал этот вопрос

SQL Соединение с нулевой таблицей сервера

и переведено условие WHERE в состояние ON.

Это код, который я сейчас использую

SELECT  

CASE
WHEN
datepart(MM,ib.[Start Time]) > 3 
and
datepart(MM,ib.[Start Time]) < 11
THEN
dateadd(hh,1,ib.[Start Time])
ELSE ib.[Start Time]  
END as [Start Time]

,ib.[reference]



      ,[Charged Op. (sec)]

       ,ob.[Reference]
     ,ob.Duration


  FROM [iPR].[dbo].[InboundCallsView] ib
  left join
  [iPR].[dbo].[OutboundCallStatus] ob
  on ib.Reference = ob.Reference
  and ob.[type] = 'Outbound call'
  and

CASE
WHEN
datepart(MM,ib.[Start Time]) > 3 
and
datepart(MM,ib.[Start Time]) < 11
THEN
dateadd(hh,1,ib.[Start Time])
ELSE ib.[Start Time]  
END

Between '2019-12-01' and '2019-12-02'

and
  ib.[account] in 

  (SELECT [accountno] 

  from idata3.dbo.[N242316])


  where 

  ib.[type] = 'normal operator call'

-- and ob.[type] = 'Outbound call'

and
  ib.[account] in 

  (SELECT [accountno] 

  from idata3.dbo.[N242316])


and

CASE
WHEN
datepart(MM,ib.[Start Time]) > 3 
and
datepart(MM,ib.[Start Time]) < 11
THEN
dateadd(hh,1,ib.[Start Time])
ELSE ib.[Start Time]  
END

Between '2019-12-01' and '2019-12-02'


  order by ib.[Start Time]

, и он создает такой результат

+---------------------+-----------+-------------------+-----------+----------+
|     Start Time      | reference | Charged Op. (sec) | Reference | Duration |
+---------------------+-----------+-------------------+-----------+----------+
| 01/12/2019 04:14:15 | W9DR4PBW  |               324 | W9DR4PBW  | 68       |
| 01/12/2019 04:29:12 | QX3652QA  |                37 | NULL      | NULL     |
| 01/12/2019 08:07:11 | LEB4EP4X  |               614 | LEB4EP4X  | 74       |
| 01/12/2019 08:38:15 | W7CRW7M7  |                39 | NULL      | NULL     |
| 01/12/2019 08:58:25 | G976V9Q7  |               242 | NULL      | NULL     |
| 01/12/2019 09:12:55 | CTTGVRWK  |                29 | NULL      | NULL     |
| 01/12/2019 09:20:29 | JRY77JSQ  |               244 | JRY77JSQ  | 6        |
| 01/12/2019 09:20:29 | JRY77JSQ  |               244 | JRY77JSQ  | 5        |
| 01/12/2019 09:20:29 | JRY77JSQ  |               244 | JRY77JSQ  | 5        |
| 01/12/2019 10:04:42 | 8M47UYWQ  |               285 | 8M47UYWQ  | 88       |
| 01/12/2019 11:35:18 | A6YVL5TW  |                19 | NULL      | NULL     |
| 01/12/2019 12:17:23 | A86ERNVX  |                13 | NULL      | NULL     |
| 01/12/2019 12:27:15 | GWQ8442D  |                47 | NULL      | NULL     |
| 01/12/2019 13:10:22 | VVLXJU44  |               122 | NULL      | NULL     |
| 01/12/2019 13:26:04 | 8RL23TF6  |                20 | NULL      | NULL     |
| 01/12/2019 13:47:54 | SAY6LZ7T  |               172 | NULL      | NULL     |
| 01/12/2019 14:38:37 | J7QBPPGV  |               158 | NULL      | NULL     |
| 01/12/2019 18:25:29 | PKU4EB5X  |                10 | NULL      | NULL     |
| 01/12/2019 20:57:50 | JDK6WAF6  |                 8 | NULL      | NULL     |
| 01/12/2019 20:58:28 | 9KYMCJ8J  |                29 | NULL      | NULL     |
+---------------------+-----------+-------------------+-----------+----------+

Это почти идеально. Однако он возвращает 20 строк, а я хочу только 18. Ссылка JRY77JSQ имеет только 1 входящий вызов, но 3 исходящих вызова. То, что я хочу сделать, это СУММИТЬ 6, 6 и 5-секундную длительность 3-х исходящих вызовов и иметь эту единственную строку со ссылкой JRY77JSQ. ie

+---------------------+-----------+-------------------+-----------+----------+
|     Start Time      | reference | Charged Op. (sec) | Reference | Duration |
+---------------------+-----------+-------------------+-----------+----------+
| 01/12/2019 04:14:15 | W9DR4PBW  |               324 | W9DR4PBW  | 68       |
| 01/12/2019 04:29:12 | QX3652QA  |                37 | NULL      | NULL     |
| 01/12/2019 08:07:11 | LEB4EP4X  |               614 | LEB4EP4X  | 74       |
| 01/12/2019 08:38:15 | W7CRW7M7  |                39 | NULL      | NULL     |
| 01/12/2019 08:58:25 | G976V9Q7  |               242 | NULL      | NULL     |
| 01/12/2019 09:12:55 | CTTGVRWK  |                29 | NULL      | NULL     |
| 01/12/2019 09:20:29 | JRY77JSQ  |               244 | JRY77JSQ  | 16       |
| 01/12/2019 10:04:42 | 8M47UYWQ  |               285 | 8M47UYWQ  | 88       |
| 01/12/2019 11:35:18 | A6YVL5TW  |                19 | NULL      | NULL     |
| 01/12/2019 12:17:23 | A86ERNVX  |                13 | NULL      | NULL     |
| 01/12/2019 12:27:15 | GWQ8442D  |                47 | NULL      | NULL     |
| 01/12/2019 13:10:22 | VVLXJU44  |               122 | NULL      | NULL     |
| 01/12/2019 13:26:04 | 8RL23TF6  |                20 | NULL      | NULL     |
| 01/12/2019 13:47:54 | SAY6LZ7T  |               172 | NULL      | NULL     |
| 01/12/2019 14:38:37 | J7QBPPGV  |               158 | NULL      | NULL     |
| 01/12/2019 18:25:29 | PKU4EB5X  |                10 | NULL      | NULL     |
| 01/12/2019 20:57:50 | JDK6WAF6  |                 8 | NULL      | NULL     |
| 01/12/2019 20:58:28 | 9KYMCJ8J  |                29 | NULL      | NULL     |
+---------------------+-----------+-------------------+-----------+----------+

То, что я пытался сделать, это заменить каждый символ столбца на MAX ([столбец]), за исключением ob. [Duration], который я заменил на SUM (ob. [Duration]). К сожалению, это вернуло меня к моей первоначальной проблеме, когда NULL исчезли, и у меня остались только 4 строки, которые имели информацию из таблицы [iPR]. [Dbo]. [OutboundCallStatus]. Как мне группировать, сохраняя NULL?

1 Ответ

1 голос
/ 10 января 2020

Вы должны использовать group by и sum. Попробуйте следующий запрос:

SELECT  CASE WHEN datepart(MM,ib.[Start Time]) > 3 and datepart(MM,ib.[Start Time]) < 11 THEN dateadd(hh,1,ib.[Start Time])
                ELSE ib.[Start Time] END as [Start Time]
        ,ib.[reference]
        ,[Charged Op. (sec)]
        ,ob.[Reference]  
        ,Sum(ob.Duration) as Duration
FROM [iPR].[dbo].[InboundCallsView] ib
left join [iPR].[dbo].[OutboundCallStatus] ob
          on ib.Reference = ob.Reference and ob.[type] = 'Outbound call'    
where ib.[type] = 'normal operator call' and
        CASE WHEN datepart(MM,ib.[Start Time]) > 3 and datepart(MM,ib.[Start Time]) < 11 THEN dateadd(hh,1,ib.[Start Time])
                            ELSE ib.[Start Time] END Between '2019-12-01' and '2019-12-02'
            and ib.[account] in (SELECT [accountno] 
                             from idata3.dbo.[N242316])  
Group by CASE WHEN datepart(MM,ib.[Start Time]) > 3 and datepart(MM,ib.[Start Time]) < 11 THEN dateadd(hh,1,ib.[Start Time])
                ELSE ib.[Start Time] END 
        ,ib.[reference]
        ,[Charged Op. (sec)]
        ,ob.[Reference]     
order by ib.[Start Time]
...