Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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中的嵌套聚合返回为空?_Sql_Sql Server_Sql Server 2016 - Fatal编程技术网

如果任何部分为空,SQL中的嵌套聚合返回为空?

如果任何部分为空,SQL中的嵌套聚合返回为空?,sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,请原谅我是SQL的新手,但我很难将这个表数据构建成一种更为串联的形式,其中有两列中有空值。下面是表中的一些虚拟数据: TRIAL_ID TRT_NO TRT_NAME RATE RATE_UNIT ---------- ------ ---------- ---- --------- ID19103601 1 Control NULL NULL ID19103601 2 Product201 25 % V/V

请原谅我是SQL的新手,但我很难将这个表数据构建成一种更为串联的形式,其中有两列中有空值。下面是表中的一些虚拟数据:

TRIAL_ID    TRT_NO  TRT_NAME    RATE    RATE_UNIT
----------  ------  ----------  ----    ---------
ID19103601  1       Control     NULL    NULL
ID19103601  2       Product201  25      % V/V
ID19103601  3       Product356  16      fl oz/gal
ID19103601  3       Product431  1       fl oz/gal
ID19103601  4       Product008  12.5    % V/V
ID19103601  4       Product123  12.5    % V/V
ID19103601  4       Product745  24      fl oz/gal
ID19500906  1       Control     NULL    NULL
ID19500906  2       Product201  25      % V/V
ID19500906  2       Product356  16      fl oz/gal
ID19500906  3       Product431  1       fl oz/gal
ID19500906  3       Product008  12.5    % V/V
ID19706400  1       Control     NULL    NULL
ID19706400  2       Product745  24      fl oz/gal
ID19706400  2       Product123  12.5    % V/V
ID19706400  2       Product358  16      g/gal
因此,治疗可以有多个产品,这意味着我想在一行中显示治疗的所有名称,后跟它们各自的比率。我能够使用其他示例并使聚合与下面的代码一起工作。顺便说一句,这是SQL Server 2016,所以我没有组或字符串:

在就如何定义子查询进行了一段时间的讨论之后,这段代码让我几乎达到了我想要的结果:

SELECT t1.TRIAL_ID, t1.TRT_NO,
    (SELECT TRT_NAME + ', (' + CONVERT(varchar(10), RATE) + ' ' + RATE_UNIT + '), '
    FROM dbo.TRT t2
    WHERE t2.TRT_NO = t1.TRT_NO AND t2.TRIAL_ID = t1.TRIAL_ID
    ORDER BY TRT_NO
    FOR XML PATH('')
    ) AS TRT_NAME_CONCAT
FROM dbo.TRT t1
GROUP BY TRIAL_ID, TRT_NO
但正如您所看到的,如果RATE或RATE_UNIT为NULL,它也会删除控制字符串。我在这里遗漏了什么

TRIAL_ID    TRT_NO  TRT_NAME_CONCAT
----------  ------  ----------
ID19103601  1   
ID19103601  2       Product201, (25 % V/V),
ID19103601  3       Product356, (16 fl oz/gal), Product431, (1 fl oz/gal),
ID19103601  4       Product008, (12.5 % V/V), Product123, (12.5 % V/V), Product745, (24 fl oz/gal),
ID19500906  1   
ID19500906  2       Product201, (25 % V/V), Product356, (16 fl oz/gal),
ID19500906  3       Product431, (1 fl oz/gal), Product008, (12.5 % V/V),
ID19706400  1   
ID19706400  2       Product745, (24 fl oz/gal), Product123, (12.5 % V/V), Product358, (16 g/gal),
在我知道骨骼工作正常后,我将处理如何去掉挂在上面的逗号。 我真的是一个彻头彻尾的傻瓜,但我尽我最大的努力教育自己,直到我真的陷入困境。如果有其他更好的方法,我很高兴听到这样的消息:

使用空值进行串联会返回空值。你可以跟我核对一下ISNULL@Column,将空值设为空格,空格将正确连接

例如,对于导致问题的代码行:

(SELECT TRT_NAME + 
        ', (' + CONVERT(varchar(10), ISNULL(RATE,'')) + 
        ' ' + 
        ISNULL(RATE_UNIT,'') + '), '
问题是用于字符串连接的+运算符。若任何参数为NULL,则结果为NULL

相反,使用concat。这可能是您想要的:

(SELECT CONCAT(TRT_NAME, 
               ', (',
               RATE, 
               ' ',
               RATE_UNIT
               '), '
              )
这将处理空值

如果一个或两个速率都为NULL,则上面的值可能会有比您想要的更多的空间。要处理这个问题:

(SELECT CONCAT(TRT_NAME, 
               ', (',
               COALESCE(RATE + ' ', ''),
               RATE_UNIT
               '), '
              )

如果RATE为NULL,这将消除额外的空间。

您可以在连接的列上使用COALESCE或ISNULL,这样就不会导致NULL

SELECT t1.TRIAL_ID, t1.TRT_NO,
    (SELECT TRT_NAME + ', (' + CONVERT(varchar(10), COALESCE(RATE,'')) + ' ' + COALESCE(RATE_UNIT,'') + '), '
    FROM dbo.TRT t2
    WHERE t2.TRT_NO = t1.TRT_NO AND t2.TRIAL_ID = t1.TRIAL_ID
    ORDER BY TRT_NO
    FOR XML PATH('')
    ) AS TRT_NAME_CONCAT
FROM dbo.TRT t1
GROUP BY TRIAL_ID, TRT_NO

用您正在使用的数据库标记您的问题。