我有一个问题,关于如何编写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
列链接的作业。
因此,我提供的示例数据显示:
我想生成一个输出FK
,Start
和END
的查询,其中它按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>
感谢您的帮助,
-乔尔
答案 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