簡體   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