SQL Server:在保留保留NULL结果的同时,对联接表中的一个字段进行分组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server:在保留保留NULL结果的同时,对联接表中的一个字段进行分组相关的知识,希望对你有一定的参考价值。
我试图连接两个表,并基于字段ob。[type]限制右手表的输出。起初,我努力保留左联接的NULL值,但是我读了这个问题
并将我的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 中创建聚集索引,同时仍保留主键?