подсчет результатов сложного запроса

#mysql

#mysql

Вопрос:

Приведенный ниже запрос выдает следующие результаты:

  ------------ ------------ 
| testID     | testStatus|
 ------------ ------------ 
|          1 | PASS       |
|          2 | PASS       |
|          3 | SKIP       |
|          4 | PASS       |
 ------------ ------------ 
  

Как я могу изменить запрос, чтобы он выдавал мне количество ПРОХОДОВ, количество ПРОПУСКОВ, количество СБОЕВ и % ПРОПУСКОВ, SKIP%, FAIL %

     SELECT orsm.testID, orsm.testStatus
    FROM mdro orsm, mdr mr, cmt cm,
    mmrprt mrt, mmtt mtt, mmuq mui, mmgt mgt, mmft mft
    WHERE mr.cmtID = cm.ID 
    AND orsm.ParentID = mr.ID 
    AND cm.IdentID = mui.ID 
    AND cm.DEVID = 2 
    AND cm.TestoID = mrt.ID 
    AND cm.SterID = mtt.ID 
    AND cm.FDID = mft.ID 
    AND cm.GID = mgt.ID 
    AND mui.ID="2" 
    AND mrt.Name="cameron" 
    AND mtt.Name="synthesis" 
    AND mft.Name="dupocdna" 
    AND mgt.Name="cce"
  

Ответ №1:

Я считаю, что что-то подобное должно сработать, если я чего-то не понимаю:

 SELECT 
SUM(IF(orsm.testStatus="PASS",1,0)) as pass_count,
SUM(IF(orsm.testStatus="SKIP",1,0)) as skip_count,
SUM(IF(orsm.testStatus="SKIP",1,0)) / COUNT(*) as skip_pct,   
SUM(IF(orsm.testStatus="PASS",1,0)) / COUNT(*) as pass_pct,
SUM(IF(orsm.testStatus="FAIL",1,0)) / COUNT(*) as fail_pct

FROM mdro orsm, mdr mr, cmt cm,
mmrprt mrt, mmtt mtt, mmuq mui, mmgt mgt, mmft mft
WHERE mr.cmtID = cm.ID 
AND orsm.ParentID = mr.ID 
AND cm.IdentID = mui.ID 
... ALL THE REST OF YOUR ANDS ...
  

Комментарии:

1. отлично работает! что делает group by ‘x’, а также ==, похоже, не работает, выдает ошибку, в то время как = работает, это нормально?

2. @user391986 Да, вам следует заменить == на = . Это была честная ошибка со стороны Мэтта. Я думаю, вам следует удалить GROUP BY, хотя, поскольку в этом случае это ничего не делает.

3. Спасибо, я редактирую ответ. Вы правы в обоих случаях. Я привык помещать ГРУППУ независимо ни от чего, но в этом нет необходимости.

Ответ №2:

Прежде всего, вы можете получить то, что хотите, используя предложение GROUP BY:

 SELECT orsm.testStatus, count(orsm.testID)
FROM ...
WHERE ...
GROUP BY orsm.testStatus
  

Кроме того, вам действительно следует использовать JOIN вместо огромного предложения WHERE с равенствами между столбцами разных таблиц. Это повышает производительность вашего запроса и его разборчивость:

 SELECT orsm.testID, orsm.testStatus
FROM cmt cm
    JOIN mdr mr ON mr.cmtID = cm.ID 
        JOIN mdro orsm ON orsm.ParentID = mr.ID 
    JOIN mmrprt mrt ON mrt.ID = cm.TestoID
    JOIN mmtt mtt ON mtt.ID = cm.SterID
    JOIN mmuq mui ON mui.ID = cm.IdentID
    JOIN mmgt mgt ON mgt.ID = cm.GID
    JOIN mmft mft ON mft.ID = cm.FDID
WHERE
    cm.DEVID = 2 
    AND mui.ID="2" 
    AND mrt.Name="cameron" 
    AND mtt.Name="synthesis" 
    AND mft.Name="dupocdna" 
    AND mgt.Name="cce"
  

Комментарии:

1. спасибо за предупреждение для группы, это работает частично, но если нет данных, я не получаю столбец для других статусов

Ответ №3:

Это становится немного сложнее, когда вы хотите также вычислить процент:

 SELECT orsm.testStatus, COUNT(*) AS count, COUNT(*) / matches.total * 100 AS percentage
FROM cmt cm
  JOIN mdr mr ON mr.cmtID = cm.ID 
  JOIN mdro orsm ON orsm.ParentID = mr.ID 
  JOIN mmrprt mrt ON mrt.ID = cm.TestoID
  JOIN mmtt mtt ON mtt.ID = cm.SterID
  JOIN mmuq mui ON mui.ID = cm.IdentID
  JOIN mmgt mgt ON mgt.ID = cm.GID,
  JOIN mmft mft ON mft.ID = cm.FDID,
  (
    SELECT COUNT(*) AS total
    FROM cmt cm
      JOIN mdr mr ON mr.cmtID = cm.ID 
      JOIN mdro orsm ON orsm.ParentID = mr.ID 
      JOIN mmrprt mrt ON mrt.ID = cm.TestoID
      JOIN mmtt mtt ON mtt.ID = cm.SterID
      JOIN mmuq mui ON mui.ID = cm.IdentID
      JOIN mmgt mgt ON mgt.ID = cm.GID,
      JOIN mmft mft ON mft.ID = cm.FDID,
    WHERE
      cm.DEVID = 2 
      AND mui.ID="2" 
      AND mrt.Name="cameron" 
      AND mtt.Name="synthesis" 
      AND mft.Name="dupocdna" 
      AND mgt.Name="cce"
  ) matches
WHERE
  cm.DEVID = 2 
  AND mui.ID="2" 
  AND mrt.Name="cameron" 
  AND mtt.Name="synthesis" 
  AND mft.Name="dupocdna" 
  AND mgt.Name="cce"