我有一个包含以下数据列的表:
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(一条或多条线具有正检查的订单)
我花了一个上午试图找到一个解决方案,但找不到任何我理解得足够或类似的东西,以至于我可以将其分解并理解它。
如果有人可以通过指向我正确的方向来帮助我,或者可以提供一个解释样本,我将非常感激。
答案 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
代表一行:
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;
这可以让你得到你想要的东西。
请注意,我使用`
进行检查,因为这是mysql reserved word