Mysql GROUP Command - PullRequest
       8

Mysql GROUP Command

0 голосов
/ 04 октября 2011

У меня запрос, который вытащил отчет, зависит от даты аудита, но я очень запутался в том, что команда 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 |
+-------------+---------------+---------------------+------------+---------------------+

А затем я удалил prd.fldorderid в команде GROUP, чтобы отчет был сгруппирован по базе только с EmployeeNo. Но вывод возвращает только 1 строку вместо трех. Пожалуйста, смотрите ниже запрос и вывод.

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 №.

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Вы должны проверить способ группировки, начиная с MySQL doc :

MySQL расширяет использование GROUP BY, так что список выбора может ссылаться на неагрегированные столбцы без именв предложении GROUP BY.Это означает, что предыдущий запрос является допустимым в MySQL.Вы можете использовать эту функцию для повышения производительности, избегая ненужной сортировки и группировки столбцов.Однако это полезно, прежде всего, когда все значения в каждом неагрегированном столбце, не названном в GROUP BY, одинаковы для каждой группы.Сервер может выбрать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными.Кроме того, на выбор значений из каждой группы нельзя повлиять, добавив предложение ORDER BY.Сортировка набора результатов происходит после выбора значений, и ORDER BY не влияет на то, какие значения сервер выбирает

Изменить для объяснения.В следующем примере:

  SELECT column1
       , column2
GROUP BY column1

Если таблица может иметь разные значения column2 при одном значении column1, это небезопасно, поскольку в любое время при выполнении запроса вы можете получить другое значение column2.В вашем подзапросе вы делаете это, и вам следует переписать запрос, чтобы избежать его.

0 голосов
/ 04 октября 2011

Группировка по сворачивает все строки с одинаковым значением в данном столбце.

Обратите внимание, что ErrorCount для вас - одна строка.
Это обычно означает, что на самом деле есть только 1 строка, соответствующая критериям этого запроса.
Другими словами, результат будетто же самое с и без группы.

Попробуйте изменить определение ErrorCount на count(*) as ErrorCount.
Если количество ошибок по-прежнему равно 1. Ваши базовые данные изменились, так что выбрана только одна строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...