繁体   English   中英

如何检查数据库行的所有实例是否相同,如果是,则在 SQL 中计数 + 1?

[英]How to check if all instances of a DB row are the same and if so count + 1 in SQL?

我有以下 SQLite 数据库表:

app | vendor | active
---------------------
123 |  AGX   | 1
123 |  OTMA  | 0
123 |  PEI   | 0

255 |  IYU   | 0
255 |  MAG   | 0
255 |  MEI   | 0

675 |  IUU   | 0
675 |  AGU   | 0
675 |  O3I   | 0

我需要能够运行查询以找出这些应用程序,哪些没有活跃的供应商

在上面的示例中, app 255app 675没有活动供应商 (0),因此我的查询返回应该是2

到目前为止,我只能运行查询来获取“假”的行数,但不能获取所有实例中为假的应用程序的数量:

SELECT COUNT(*) FROM app_vendor WHERE active = 0

总结:如果单个应用程序的所有行都为“假”,则应将计数加 1。

此查询将为您提供没有活跃供应商的应用程序列表:

SELECT app
FROM app_vendor
GROUP BY app
HAVING SUM(CASE WHEN active = true THEN 1 ELSE 0 END) = 0

要计算记录,您可以将其包装在子查询中:

SELECT COUNT(*) FROM (
  SELECT app
  FROM app_vendor
  GROUP BY app
  HAVING SUM(CASE WHEN active = true THEN 1 ELSE 0 END) = 0
)
SELECT COUNT(*)
FROM (
      SELECT app, COUNT(*)
      FROM demo
      GROUP BY app
      HAVING MAX(active) = 0
)

所以基本上你通过应用程序创建供应商组,然后检查组中的最大值是否为 false(这意味着 true 不存在)。

确实应该有更优雅的方式。

大概,您有一个app表,每个app一行。 我建议使用这个:

select a.*
from app a
where not exists (select 1
                  from app_vendor av
                  where av.app = a.app and av.active = 1
                 );

这种方法与仅使用app_vendor表本身相比有两个优点:

  1. 通过避免外部聚合,在许多情况下它可能会更快。
  2. 它将返回没有供应商的应用程序。

您需要聚合和COUNT() window function:

SELECT DISTINCT COUNT(*) OVER() AS counter
FROM app_vendor
GROUP BY app
HAVING MAX(active) = 0

请参阅演示
结果:

柜台
2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM