基于组内标准的MySQL计数记录

时间:2013-12-11 14:14:21

标签: php mysql

我有一个包含以下数据列的表:

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

检查栏指示我们是否已完全提供零或以下值的订单行,这意味着“是的,我们已提供完整”,值为1或更高,意味着“我们没有提供完整”。

要计算订单填充率(已完成填写的订单数量),我需要知道有多少订单每个条目只有零检查结果,以及有多少订单至少有一个正面检查结果。

我的逻辑是我需要对项目进行GROUP,然后在组内执行COUNTIF(这可能是错误的SQL方法,但从逻辑上讲,它对我来说对我正在寻找的结果有意义)。从这个查询我需要将这两个值返回到我的PHP脚本。

此数据集的结果将是: 完成= 1(只有零检查的订单) 不完整= 2(一条或多条线具有正检查的订单)

我花了一个上午试图找到一个解决方案,但找不到任何我理解得足够或类似的东西,以至于我可以将其分解并理解它。

如果有人可以通过指向我正确的方向来帮助我,或者可以提供一个解释样本,我将非常感激。

3 个答案:

答案 0 :(得分:1)

对于包含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:

代表一行:

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];

答案 1 :(得分:1)

SELECT ord_number,IF(MAX(check)< = 0,'COMPLETED','PENDING') 来自TABLENAME  分组(ord_number

通过此在线查询,您可以轻松获得处于待处理状态的订单以及哪一处处于完整状态

根据您提供的详细信息

  

检查栏表示我们是否已完全提供订单行   值为零或以下意味着“是的,我们提供了完整的”   值为1或以上表示“我们没有提供完整的”。

表示检查列可以包含负值,0表示完整状态,1表示任意正整数,表示待处理状态。

所以逻辑应该找到最大值(检查),所以如果找到订单的最大值为0或任何负数,那么我们将确定订单已完成,如果找到正数,则表示存在待处理的条目

答案 2 :(得分: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 demo

请注意,我使用`进行检查,因为这是mysql reserved word