#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"