SQL Server ISNULL multiple columns



我有以下查询,效果很好,但是如何在其选择语句中添加多列?以下是查询:

SELECT ISNULL(
(SELECT DISTINCT a.DatasourceID
FROM [Table1] a
WHERE a.DatasourceID = 5 AND a.AgencyID = 4 AND a.AccountingMonth = 201907), NULL) TEST

所以目前我只得到一列(测试(,但想添加其他列,如数据源ID,机构ID和会计月。

如果要为某些条件(或请求的值(输出一行,并在不满足条件时输出一行, 您可以在 FROM 子句中为请求的值设置伪表,并与 Table1 进行左外连接。

SELECT ISNULL(Table1.DatasourceId, 999999), 
Table1.AgencyId,
Table1.AccountingMonth, 
COUNT(*) as count
FROM ( VALUES (5, 4, 201907 ),
(6, 4, 201907 ))
AS requested(DatasourceId, AgencyId, AccountingMonth)
LEFT OUTER JOIN Table1 ON requested.agencyid=Table1.AgencyId
AND requested.datasourceid = Table1.DatasourceId
AND requested.AccountingMonth = Table1.AccountingMonth
GROUP BY Table1.DatasourceId, Table1.AgencyId, Table1.AccountingMonth

请注意:

  • 我已经为第一列放置了一个 ISNULL,就像您在找不到值时输出特定值 (9999( 一样。
  • 我没有像您的查询一样将 ISNULL(...,NULL( 放在其他列中,因为恕我直言,没有必要:如果没有值,无论如何都会输出一个 null。
  • 我添加了一个 COUNT(*( 列来说明聚合,如果您不需要它,您可以使用另一个(SUM、MIN、MAX(或 none 。
  • 请求值集作为常量表值提供(请参阅 https://learn.microsoft.com/en-us/sql/t-sql/queries/table-value-constructor-transact-sql?view=sql-server-2017(
    我为请求的条件添加了多行:您可以在一个查询中请求多个数据源、机构或月份,输出中每个数据源、机构或月份一行。
    如果只需要一行,则在"请求的"伪表值中仅放置一行。
  • 必须有一个 GROUP BY,即使您不想使用聚合(计数、总和或其他(以便具有与 distinct 子句相同的行为,它也会将输出限制为请求值的单行。

对我来说,您似乎想查看数据是否存在,我猜您的机构ID是机构表的外键,数据源ID也是数据源的外键,并且您有包含所有会计期间的会计月份表:

SELECT ds.ID as DataSourceID , ag.ID as AgencyID ,  am.ID as AccountingMonth , 
ISNULL(COUNT(a.*),0) as Count
FROM [Table1] a
RIGHT JOIN [Datasource] ds ON ds.ID = a.DataSourceID
RIGHT JOIN [Agency] ag ON ag.ID = a.AgencyID
RIGHT JOIN [AccountingMonth] am on am.ID = a.AccountingMonth 
GROUP BY ds.ID, ag.ID,  am.ID

通过这种方式,您可以按条件查看每组的记录计数。注意 RIGHT JOIN,如果要包含"Right"表中的所有记录,则必须使用 RIGHT JOIN。

在您的查询中,您有 DISTINCT a.DatasourceID 和 WHERE a.DatasourceID = 5,如果表中存在与您的 WHERE 条件匹配的行,则返回 5,如果没有数据,则返回 null。如果删除 WHERE a.DatasourceID = 5,则查询将中断并显示错误:子查询返回多行。

您这样做的方式只允许一列和一条记录,并为其命名为test。看起来您并不真的需要测试空值。因为您返回的是 null,所以这对您没有任何帮助。删除所有 null 测试并返回完整的记录集 distinct 也会将返回限制为 1 条记录。使用单个表时,如果没有空格或关键字,则不需要别名,则不需要大括号标识符。如果需要查看是否有空记录集,请在调用程序中对其进行测试。

SELECT  DatasourceID, AgencyID,AccountingMonth
FROM Table1 
WHERE DatasourceID = 5 AND AgencyID = 4 AND AccountingMonth = 201907

最新更新