【问题标题】:only select count value if total row count is equal to row count with special ID仅当总行数等于具有特殊 ID 的行数时才选择计数值
【发布时间】:2011-10-12 17:33:23
【问题描述】:

我需要选择具有某个ID的总行数如果它等于表中的总最大行数。

我在这个例子中使用了变量,但我想只用 一个选择语句

DECLARE @a int, @b int

--total with special field (redcar = yes)
SELECT @a = (SELECT COUNT(*) FROM dbo.car WHERE redcar = 'yes') 

-- max total of table
SELECT @b = (SELECT COUNT(*) FROM dbo.car) 

IF(@a = @b)
BEGIN
SELECT @a
END

示例 dbo.car

id  redcar
1    yes
2    
3    yes
4
5
6

输出应该为 0,因为 red car 不等于 table 的总行数

【问题讨论】:

    标签: sql tsql stored-procedures loops ssis


    【解决方案1】:

    我能想到的最快方法:

    SELECT COUNT(*)
    FROM dbo.car
    WHERE NOT EXISTS (SELECT 1 FROM dbo.CAR where COALESCE(redcar, '') <> 'yes')
    

    由于您要返回所有行,这只是检查是否有任何行不符合您的条件,如果是,则应返回 0 或不返回任何内容。

    【讨论】:

    • 这表示:对于每一行,检查是否有任何非红色汽车。然后计算匹配的行数。如果没有查询优化器,这将对每一行进行一次表扫描,或者 O(N^2) 算法。
    • @Andomar - 它不相关,因此它只会运行一次检查。
    • +1 注意到最初读取的规范,“仅当总行数等于具有特殊 ID 的行数时才选择计数值”,这立即建议寻找不匹配的行。
    【解决方案2】:

    这应该可以解决问题:

    SELECT ISNULL(b.numrows, 0) as numrows
    FROM (
        SELECT COUNT(*) AS numrows FROM car
    ) a
    LEFT JOIN (
        SELECT COUNT(*) AS numrows FROM car WHERE redcar = 'yes'
    ) b ON b.numrows = a.numrows
    

    【讨论】:

      【解决方案3】:

      我认为你可以这样做:

      SELECT count(*)
        FROM dbo.car
      HAVING count(*) = sum (Case When redcar = 'yes' Then 1 Else 0 End)
      

      或者这个:

      SELECT allcars
        FROM (SELECT COUNT(*) redcars FROM dbo.car WHERE redcar = 'yes') as redcars
        cross join (SELECT COUNT(*) allcars FROM dbo.car) as allcars
       WHERE redcars = allcars
      

      但是为什么你想要一个查询呢?使用像代码这样的变量更容易阅读。

      【讨论】:

      • 它运行没有错误,但即使 redcars 总数不等于表的总最大行数,我也只会得到最大行数。我刚刚发布了一张表格的图表。
      【解决方案4】:

      如果匹配的行数与总行数不同,您可以使用case 返回0

      SELECT  case when count(*) = (select count(*) from dbo.car) then count(*)
              else 0
              end
      FROM    dbo.car 
      WHERE   redcar = 'yes'
      

      如果条件不满足,这将返回一行0if 语句根本不会返回任何行集。您可能需要调整客户端代码以解决此问题。

      【讨论】:

      • 它运行没有错误,但即使 redcars 总数不等于表的总最大行数,我也只会获得最大行数。我刚刚发布了一张表格的图表。
      • @user719825 - 你试过我的查询了吗?
      • @user719825:查询已编辑,因此如果行数不匹配则返回 0
      猜你喜欢
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2017-07-03
      • 2022-11-28
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多