[英]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
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;
這應該給您您想要的。
注意我在檢查周圍使用了`
,因為這是一個mysql保留字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.