SQL Server ISNULL多列

时间:2019-10-06 17:21:53

标签: sql sql-server isnull

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

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

因此,目前我只获得一列(TEST),但想添加其他列,例如DataSourceID,AgencyID和AccountingMonth。

3 个答案:

答案 0 :(得分:0)

在我看来,您似乎想查看数据是否存在,我想您的AgencyID是代理表的外键,DataSourceID也是数据源,并且您有AccountingMonth表,其中包含所有会计期间:

    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,则查询将因错误而中断:子查询返回了多行。

答案 1 :(得分:0)

您的操作方式仅允许一列和一条记录,并为其指定测试名称。看起来您真的不需要测试null。因为您返回的是null,所以对您没有任何帮助。删除所有空测试,并返回完整的记录集也将您的返回限制为1条记录。使用单个表时,如果没有空格或关键字,则不需要别名,不需要别名。如果需要查看是否有空记录集,请在调用程序中对其进行测试。

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

答案 2 :(得分:0)

如果您要为某个条件(或请求的值)输出一行,并在不满足条件的情况下输出一行, 您可以在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),如果不需要,则可以不使用。
  • 请求值的集合以常量表值的形式提供(请参见https://docs.microsoft.com/en-us/sql/t-sql/queries/table-value-constructor-transact-sql?view=sql-server-2017
    我为要求的条件添加了多行:您可以在一个查询中请求多个数据源,代理商或月份,而在输出中每行只请求一行。
    如果只需要一行,请在“请求的”伪表值中仅放置一行。
  • 即使您不想使用聚合(计数,总和或其他),也必须有一个GROUP BY,以便与您的unique子句具有相同的行为,它将输出限制为请求值的单行。