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脚本中。

该数据集的结果为:完成=1(只有零支票的订单)不完整=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];

选择ord_number,IF(MAX(check)<0,"已完成","正在结束")来自TABLENAME按(ord_number)分组

通过这个单行查询,您将很容易获得哪个订单处于挂起状态,哪个订单处于完整状态

根据您提供的详细信息

复选栏指示我们是否已完全提供订单行值为零或以下表示"是的,我们已经提供了完整的"值为1或以上表示"不,我们没有提供完整的"。

这意味着check列可以包含负值,0表示完成状态,1或任何正整数表示挂起状态。

所以逻辑应该是find the max(check),所以如果订单的max是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的总行数。

然后你做一个计数来验证这两者何时相等:

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保留字