Mysql

在同一個表中使用和不使用 WHERE 子句執行 SQL 計數

  • July 30, 2020

這是我的第一篇文章,如果我不夠簡潔,我深表歉意。我正在嘗試提出一個 SQL 查詢來辨識數據質量問題。

這是範例表:

DeviceOS    Bytes  
Roku        10,000  
AppleTV     -50000
SamsungTV   -100000  
Roku        -100000  
AppleTV      30000
Roku        -90000
AppleTV     -20000
AppleTV     -10000
SamsungTV   -100000

輸出表:

DeviceOS   Total Count  bad_count
Roku       3            2 
AppleTV    4            2
SamsungTV  1            1   

Total_count 欄位基於 deviceOS 聚合,bad_count 僅獲取兆字節欄位為負的所有行。

基本上試圖做到這一點-> DeviceOS 從表組中選擇 DeviceOS,count(*)

從表 DeviceOS 中選擇 DeviceOs,count(*),其中兆字節 < 0

如何將上述兩個查詢組合起來,並將它們的結果顯示在一起,類似於輸出表?

對於 MySQL 使用簡單

SELECT DeviceOS, 
      COUNT(*) `Total Count`,
      SUM(Bytes &lt; 0) bad_count
FROM source_table
GROUP BY DeviceOS

對於 BigQuery 使用

SELECT DeviceOS, 
      COUNT(*) `Total Count`,
      COUNTIF(Bytes &lt; 0) bad_count
FROM source_table
GROUP BY DeviceOS

您可以對 SQL Server 執行以下操作:

SELECT DeviceOS                  AS DeviceOS
    , COUNT(*)                  AS TotalCount
    , SUM(IIF(Bytes &lt; 0, 1, 0)) AS BadCount
FROM (
        VALUES ('Roku', 10000)
             , ('AppleTV', -50000)
             , ('SamsungTV', -100000)
             , ('Roku', -100000)
             , ('AppleTV', 30000)
             , ('Roku', -90000)
             , ('AppleTV', -20000)
             , ('AppleTV', -10000)
             , ('SamsungTV', -100000)
    ) AS t1 (DeviceOS, Bytes)
GROUP BY DeviceOS

我們按 DeviceOS 列分組並獲取名稱和計數。

唯一棘手的部分是使用SUM(IIF(Bytes &lt; 0, 1, 0)) AS BadCount錯誤計數。

它的作用是檢查字節大小是否小於 0(意味著它是負數):

  • 如果是,則將**+1**添加到總和
  • 如果不是,則將**+0**添加到總和

引用自:https://dba.stackexchange.com/questions/270300