【问题标题】:How to check if all instances of a DB row are the same and if so count + 1 in SQL?如何检查数据库行的所有实例是否相同,如果是,则在 SQL 中计数 + 1?
【发布时间】:2021-05-21 13:23:43
【问题描述】:

我有以下 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 255 和 app 675 没有活跃的供应商 (0),因此我的查询返回应该是 2。

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

SELECT COUNT(*) FROM app_vendor WHERE active = 0

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

【问题讨论】:

  • 这就是为什么优步的价格如此之高 :D。您可以按 App 分组并仅选择 MAX(active) == 0... 如果 active 是位列
  • 是的,请告诉我们您使用的究竟是什么 sql...MSSQL、MySQL...?
  • 我正在使用 SQLite。这确实是一个位列(我已经编辑了这个问题以反映这一点)。您能否提供完整的查询?可以添加为答案。
  • 如何按“应用”分组?

标签: sql sqlite count


【解决方案1】:
SELECT COUNT(*)
FROM (
      SELECT app, COUNT(*)
      FROM demo
      GROUP BY app
      HAVING MAX(active) = 0
)

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

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

【讨论】:

  • 我想这已经差不多了!它返回许多行,但不是所有实例中所有 active = 0 的应用程序的最终计数
  • 哦,明白了...它为每个应用返回了类似的计数
【解决方案2】:

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

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
)

【讨论】:

    【解决方案3】:

    大概,您有​​一个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. 它将返回没有供应商的应用程序。

    【讨论】:

      【解决方案4】:

      你需要聚合和COUNT()窗口函数:

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

      请参阅demo。
      结果:

      counter
      2

      【讨论】:

        猜你喜欢
        • 2020-02-03
        • 1970-01-01
        • 2021-04-05
        • 2013-11-09
        • 1970-01-01
        • 2013-08-30
        • 2014-07-15
        • 1970-01-01
        相关资源
        最近更新 更多