SQL Server:在保留保留NULL结果的同时,对联接表中的一个字段进行分组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server:在保留保留NULL结果的同时,对联接表中的一个字段进行分组相关的知识,希望对你有一定的参考价值。

我试图连接两个表,并基于字段ob。[type]限制右手表的输出。起初,我努力保留左联接的NULL值,但是我读了这个问题

SQL Server null table join

并将我的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个出站呼叫。我想做的是求和3个出站呼叫的6、6和5秒的持续时间,并将其作为JRY77JSQ参考的唯一行。即

+---------------------+-----------+-------------------+-----------+----------+
|     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([column])替换每个列指示符,除了ob。[duration]替换为SUM(ob。[duration])。不幸的是,这使我回到了最初的问题,即NULL消失了,仅剩下[iPR]。[dbo]。[OutboundCallStatus]表中包含信息的4行。如何在保留NULL的同时进行分组?

答案

您应该使用分组和和。尝试以下查询:

以上是关于SQL Server:在保留保留NULL结果的同时,对联接表中的一个字段进行分组的主要内容,如果未能解决你的问题,请参考以下文章

使用SSIS从SQL Server 2005中的平面文件导入时如何保留NULL值

如何在 SQL Server 中创建聚集索引,同时仍保留主键?

在第二个查询中查询两个单独的表传递结果,同时仅在第二个查询返回 null 时保留第一个查询的结果

sql server 保留2位小数,如果整数 后面补0

SQL Server 旋转一列并保留其他列

排除 MS SQL Server 2008 中的“某些”重复行