簡體   English   中英

基於組內條件的MySQL計數記錄

[英]MySQL Count Records Based On Criteria Within A Group

我有一個包含以下數據列的表:

ord_number check
OR123      0
OR125      1
OR123      2
OR123      0
OR124      0
OR124      0
OR125      0
OR123      0

檢驗欄指示我們是否已向訂單行完全提供零值或以下的值(表示“是,我們已完成”),而值為1或以上值的意思是“否,我們未完成”。

要計算訂單執行率(已完成多少訂單),我需要知道每個訂單中只有多少個訂單的檢查結果為零,以及至少有一個肯定的檢查結果的訂單。

我的邏輯是我需要對項目進行分組,然后在組內執行一個COUNTIF(這可能是錯誤的SQL方法,但是從邏輯上講,對於我要尋找的結果,這對我來說很有意義)。 從這個查詢中,我需要將這兩個值返回到我的PHP腳本中。

此數據集的結果將是:Complete = 1(僅接受零檢查的訂單)Incomplete = 2(其中一行或多行具有正面檢查的訂單)

我花了整整一個上午的時間來尋找解決方案,但是找不到我足夠了解或相似的東西,以至於我無法分解並理解它。

如果有人可以通過向正確的方向指點我來幫助我,或者可以為示例提供解釋,我將不勝感激。

對於具有2個計數器字段的1行,請使用:

SELECT 
  SUM(CASE WHEN `check` = 1 THEN 1 ELSE 0 END) AS incomplete,
  SUM(CASE WHEN `check` = 0 THEN 1 ELSE 0 END) AS complete
FROM orders

對於具有1個名稱的2行,請使用:

 SELECT COUNT(`ord_number`) AS fulfillment 
 FROM orders WHERE (`check`=0) 
 UNION SELECT COUNT(ord_number) 
 FROM orders WHERE (`check`=1)

在這種情況下,您需要將第1行放入$ complete(check = 0),將第2行放入$ incomplete(check = 1)

您可以添加:

 UNION SELECT COUNT(ord_number) FROM orders

這將為您提供第3行的總記錄。

輸出將是:

 SELECT * FROM orders

 ord_number  check
 ---------------------
 OR123        0
 OR124        1
 OR125        0
 OR126        0
 OR127        0
 OR123        0
 OR125        1


SELECT COUNT(`ord_number`) AS counts FROM orders or1 WHERE (`check`=0) 
UNION SELECT COUNT(ord_number) FROM orders or2 WHERE (`check`=1) 
UNION SELECT COUNT(ord_number) FROM orders

 counts
 -------
 5
 2
 7


 SELECT
 SUM(CASE WHEN `check` = 1 THEN 1 ELSE 0 END) AS incomplete, 
 SUM(CASE WHEN `check` = 0 THEN 1 ELSE 0 END) AS complete FROM orders

 incomplete complete
 -------------------------
  2         5

至於PHP:

1行:

mysql_select_db($database_test, $test);
$query_countIn1Row = " SELECT SUM(CASE WHEN `check` = 1 THEN 1 ELSE 0 END) AS  
    incomplete, 
SUM(CASE WHEN `check` = 0 THEN 1 ELSE 0 END) AS complete
FROM orders";
$countIn1Row = mysql_query($query_countIn1Row, $test) or die(mysql_error());

do {
    $varIncomplete = $row_countIn1Row['incomplete'];
    $varComplete = $row_countIn1Row['complete'];
} while ($row_countIn1Row = mysql_fetch_assoc($countIn1Row));

對於1列的計數:

mysql_select_db($database_test, $test);
$query_countOrders = "SELECT COUNT(`ord_number`) AS counts 
FROM orders or1 WHERE (`check`=0) 
UNION SELECT COUNT(ord_number) FROM orders or2 WHERE (`check`=1)
UNION SELECT COUNT(ord_number) FROM orders";
$countOrders = mysql_query($query_countOrders, $test) or die(mysql_error());

$myCounts = array();
 do {
    $myCounts[]= $row_countOrders['counts'];
 } while ($row_countOrders = mysql_fetch_assoc($countOrders));
 $complete = $myCounts[0];
 $incomplete = $myCounts[1];
 $total = $myCounts[2];

TABLENAME組中選擇ord_number ,IF(MAX( check )<= 0,'COMPLETED','PENDING')by( ord_number

通過這一單行查詢,您可以輕松獲得哪個訂單處於待處理狀態,哪個訂單處於完成狀態

根據您給定的詳細信息

檢驗欄指示我們是否已向訂單行完全提供零值或以下的值(表示“是,我們已完成”),而值為1或以上值的意思是“否,我們未完成”。

這意味着檢查列可以包含負值,也可以包含0表示完成狀態,以及1或任何正整數表示待處理狀態。

因此,邏輯上應該找到max(check),因此,如果找到的最大訂單數為0或任何負數,則我們將確保該訂單已完成,並且如果發現一個正數,則意味着存在待處理的條目。

您可以分兩步執行此操作:

SELECT ord_number,
       SUM(CASE WHEN `check` =  0 THEN 1 ELSE 0 END) as Comp,
       COUNT(`check`) as total
FROM tab1
GROUP BY ord_number

這將為您提供0(完整)的行數以及每個ord_number的總行數。

然后,您執行COUNT來驗證這兩個時間相等:

SELECT CASE WHEN comp = total THEN 'COMPLETE' ELSE 'INCOMPLETE' END AS status,
       COUNT(*) AS statusCount
FROM(
   SELECT ord_number,
       SUM(CASE WHEN `check` =  0 THEN 1 ELSE 0 END) as Comp,
       COUNT(`check`) as total
   FROM tab1
   GROUP BY ord_number) a
GROUP BY 1;

這應該給您您想要的。

sqlfiddle演示

注意我在檢查周圍使用了` ,因為這是一個mysql保留字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM