我有一个查询提取报告取决于审核日期,但我很困惑GROUP命令如何处理我对输出的期望。
这是我的疑问,
SELECT prd.fldemployeeno `EmployeeNo`,
prd.fldorderid `OrderNo`,
prd.fldstarttime `TimeProcessed`,
COUNT(qua.seqid) `ErrorCount`,
COALESCE(qua.fldstarttime,(SELECT fldstarttime FROM tblproductionitl p
WHERE (p.fldglobalid = prd.fldglobalid)
AND p.fldprojectgroup=prd.fldprojectgroup
AND p.fldstarttime > prd.fldstarttime
AND prd.fldemployeeno != p.fldemployeeno
LIMIT 0,1)) AS `AuditDate`
FROM tblproductionitl prd
INNER JOIN tblisauditeditl aud
ON prd.fldglobalid=aud.fldid
LEFT JOIN tblqualityaudit qua
ON prd.fldglobalid=qua.fldid
AND prd.fldstarttime=qua.fldprodstarttime
GROUP BY prd.fldemployeeno,prd.fldorderid
HAVING `AuditDate` BETWEEN '2011-10-04 00:00:00' AND '2011-10-04 23:59:59'
ORDER BY `AuditDate`
这是
的输出+-------------+---------------+---------------------+------------+---------------------+
| EmployeeNo | OrderNo | TimeProcessed | ErrorCount | AuditDate |
+-------------+---------------+---------------------+------------+---------------------+
| PSAA50577 | 20110930n01 | 2011-10-04 10:41:23 | 3 | 2011-10-04 10:44:07 |
| PSAA50576 | 20111003n01 | 2011-10-03 11:39:52 | 1 | 2011-10-04 10:58:48 |
| PSAA50515 | 20110930n01 | 2011-10-04 10:44:07 | 1 | 2011-10-04 11:12:03 |
| PSAA50577 | 20111003n02 | 2011-10-03 12:22:33 | 1 | 2011-10-04 16:47:16 |
| PSAA50577 | 20110930n10 | 2011-10-01 18:27:09 | 1 | 2011-10-04 18:29:29 |
+-------------+---------------+---------------------+------------+---------------------+
然后我删除了GROUP命令中的prd.fldorderid,以便报告将仅从EmployeeNo分组。但输出只返回1行而不是3行。请参阅下面的查询和输出。
SELECT prd.fldemployeeno `EmployeeNo`,
prd.fldorderid `OrderNo`,
prd.fldstarttime `TimeProcessed`,
COUNT(qua.seqid) `ErrorCount`,
COALESCE(qua.fldstarttime,(SELECT fldstarttime FROM tblproductionitl p
WHERE (p.fldglobalid = prd.fldglobalid)
AND p.fldprojectgroup=prd.fldprojectgroup
AND p.fldstarttime > prd.fldstarttime
AND prd.fldemployeeno != p.fldemployeeno
LIMIT 0,1)) AS `AuditDate`
FROM tblproductionitl prd
INNER JOIN tblisauditeditl aud
ON prd.fldglobalid=aud.fldid
LEFT JOIN tblqualityaudit qua
ON prd.fldglobalid=qua.fldid
AND prd.fldstarttime=qua.fldprodstarttime
GROUP BY prd.fldemployeeno
HAVING `AuditDate` BETWEEN '2011-10-04 00:00:00' AND '2011-10-04 23:59:59'
ORDER BY `AuditDate`
此查询的输出为:
+------------+--------------+---------------------+--------------+---------------------+
| EmployeeNo | OrderNo | TimeProcessed | ErrorCount | AuditDate |
+------------+--------------+---------------------+--------------+---------------------+
| PSAA50576 | 20111003n01 | 2011-10-03 11:39:52 | 1 | 2011-10-04 10:58:48 |
+------------+--------------+---------------------+--------------+---------------------+
任何人都可以帮我分析一下如何在第二个查询中返回1行,以及如何从Employee no中对输出库进行分组。
答案 0 :(得分:2)
您应该从MySQL doc:
检查您的分组方式MySQL扩展了GROUP BY的使用,以便选择列表可以引用 未在GROUP BY子句中命名的非聚合列。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序来获得更好的性能 分组。但是,这主要适用于每个中的所有值 GROUP BY中未命名的非聚合列对于每个列都是相同的 组。服务器可以自由选择每个组中的任何值,所以 除非它们相同,否则所选择的值是不确定的。 此外,不能从每个组中选择值 受添加ORDER BY子句的影响。对结果集进行排序 选择值后发生,ORDER BY不影响 服务器选择哪个值
编辑解释。给出这个例子:
SELECT column1
, column2
GROUP BY column1
如果表格可以有column2
给定column1
的一个值,这是不安全的,因为无论何时执行查询,您都可以获得不同的column2值。
在您的子查询中,您正在执行此操作,您应该重写查询以避免它。
答案 1 :(得分:0)
通过折叠给定列中具有相同值的所有行进行分组。
请注意,ErrorCount
对于您的单行为1
这通常意味着确实只有一行符合该查询的标准
换句话说,有和没有group by的输出相同。
尝试将ErrorCount
的定义更改为count(*) as ErrorCount
如果errorcount仍为1.您的基础数据已更改,因此只选择了一行。