Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果任何值为NULL,GROUP BY是否返回NULL?_Sql Server - Fatal编程技术网

Sql server 如果任何值为NULL,GROUP BY是否返回NULL?

Sql server 如果任何值为NULL,GROUP BY是否返回NULL?,sql-server,Sql Server,我有一个关于如何编写SQL查询来合并行的问题,这样,如果GROUPBY中的任何行为null,则值输出为null。如果MIN()将空值视为零,则我将被全部设置,但事实并非如此。我知道为什么没有,我也同意,但我不知道如何解决这个问题 举例来说,这可能更清楚。假设我有下表。称之为作业: PK FK Start End ===== == ==================== ==================== 1 7 2018-08-14 14:4

我有一个关于如何编写SQL查询来合并行的问题,这样,如果GROUPBY中的任何行为null,则值输出为null。如果MIN()将空值视为零,则我将被全部设置,但事实并非如此。我知道为什么没有,我也同意,但我不知道如何解决这个问题

举例来说,这可能更清楚。假设我有下表。称之为作业:

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

我希望可以使用
从作业组中按FK选择FK、MIN(开始)、MAX(结束)
,但忘记了定义的行为是跳过空值(控制台中的“通过聚合或其他设置操作消除空值”)

那么,是否有人对我如何不能跳过空值并强制它覆盖该分组中的任何非空值有任何指导?我曾想过使用CASE语句,但我基本上需要说“如果这个作业的
End
不是空的,但是另一个作业是空的,那么为这个作业返回null”,我想不出如何在SQL中表达这一点

谢谢你的帮助


-joel

尝试使用
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

非常感谢。当我看到你的答案时,我开始认为子查询可能是必要的。我调整了您的SQL(我发布的示例当然是简化的),它的工作方式与我想要的一样。我总是担心子查询的性能,但执行计划看起来不错,而且它在实际数据集上运行得很快。因为我知道
Start
永远不会为空,下面是有效的最终SQL。我的字段实际上被称为
EndTimestamp
,但为了简洁起见,我使用了
End
,这是一个保留字,所以我在下面将其括起来。你不能在评论中使用换行符,所以请为混乱道歉。只需将
\n
替换为一个新行即可将其重新水化:
选择\nFK\nStart\nCASE\n当[End]='9999-12-31'时,然后NULL\nELSE[End]\nEND AS[End]\nFROM(\nSELECT\nFK\nMIN(Start)Start,\nMAX(ISNULL([End],'9999-12-31'))作为[End]\nFROM\njobs与(NOLOCK)\nFROM由FK组成的组\n)t
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