如果任何值都为null,GROUP BY是否返回NULL?

时间:2018-08-14 22:18:12

标签: sql-server

我有一个问题,关于如何编写SQL查询以合并行,以便如果GROUP BY中的任何行为空,则输出的值为空。如果MIN()将null视为零,那么我将全部被设置,但事实并非如此。我知道为什么不这样做,对此我很好,但是我不确定如何解决。

用一个例子可能更清楚。假设我有下表。称为jobs

PK    FK Start                End
===== == ==================== ====================
1     7  2018-08-14 14:43:27  2018-08-14 14:43:31
2     7  2018-08-14 14:43:28  2018-08-14 14:43:35
3     8  2018-08-14 14:44:19  NULL
4     8  2018-08-14 14:44:19  2018-08-14 14:44:27
5     9  2018-08-14 14:45:03  NULL
6     10 2018-08-14 14:45:08  2018-08-14 14:45:11

与另一个表有一个外键关系,称为requests,其中一个请求可以指向一个或多个通过FK列链接的作业。

因此,我提供的示例数据显示:

  • 请求#7产生了两个均已完成的工作
  • 请求#8产生了两个作业,其中一个已完成
  • 请求#9产生了一项尚未完成的工作
  • 请求10产生了一项已完成的工作。

我想生成一个输出FKStartEND的查询,其中它按FK分组并使用MIN(Start)和{{1 }} 除非该分组的MAX(End)的任何值都为null,在这种情况下,我要输出null。

因此对于我的示例数据,这是所需的输出:

FK Start                End
== ==================== ====================
7  2018-08-14 14:43:27  2018-08-14 14:43:35
8  2018-08-14 14:44:19  NULL
9  2018-08-14 14:45:03  NULL
10 2018-08-14-14:45:08  2018-08-14 14:45:11

我可以使用这些数据快速查看End值为空的任何行仍在进行一项或多项作业。如果End不为空,则我知道该请求的所有作业都已完成,并从中减去End会告诉我从此请求的第一个作业开始到最后一个作业结束的总时间。 / p>

我希望我可以使用Start,但是忘记了定义的行为是跳过空值(“空值通过聚合或其他SET操作消除了” 消息I进入控制台)。

那么,有人对我如何跳过空值并实际上强迫它覆盖该分组中的任何非空值有任何指导吗?我曾考虑过使用CASE语句,但我基本上需要说“如果此作业的SELECT FK, MIN(Start), MAX(End) FROM jobs GROUP BY FK不为空,而另一个作业为{null,则为该作业返回null”,我想不出如何在SQL中表达这一点。 / p>

感谢您的帮助,

-乔尔

1 个答案:

答案 0 :(得分:1)

尝试使用ISNULL。您可以使用嵌套查询将设置ISNULL的值替换为null,如下所示:

SELECT 
    FK, 
    case when Start = '1900-01-01' then null else Start end as Start, 
    case when End = '9999-12-31' then null else End end as End
FROM (
    SELECT
       FK, 
       MIN(ISNULL(Start, '1900-01-01')) as Start, 
       MAX(ISNULL(End, '9999-12-31')) as End 
       FROM jobs GROUP BY FK
) t