SQL Server ISNULL多列

问题描述 投票:0回答:3

我有以下查询,该查询效果很好,但是如何在其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。

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


0
投票

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

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

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,即使您不想使用汇总(计数,总和或其他值)以与您的distingle子句具有相同的行为,它也会将输出限制为要求值的一行。 >
© www.soinside.com 2019 - 2024. All rights reserved.