如果任何部分为空,SQL中的嵌套聚合返回为空?
请原谅我是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
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
用您正在使用的数据库标记您的问题。