2016-11-28 5 views
2

сказать, что я следующий SQL даного:Mysql с помощью «как» для более расчета

SELECT 
    COUNT(UHAM.module_id) AS total, 
    COUNT(CASE WHEN UHAM.is_complete = 1 
    THEN 1 
     ELSE NULL END)  AS complete, 
    (total/complete * 100) AS percentage, 
    AT.name 
FROM user_has_academy_module UHAM 
    JOIN academy_team AT ON AT.id = UHAM.academy_team_id 
WHERE academy_team_id IN (317, 305) 
GROUP BY UHAM.academy_team_id; 

Как вы можете видеть ив используется total и complete, чтобы попытаться вычислить новое значение. Однако это не может быть сделано, как мой сценарий говорит: unknown column total

Так что мой вопрос: есть ли способ сделать выше или мне нужно писать так же count заявление еще раз (что делает SQL своего рода грязный)

+0

Недопустимый элемент GROUP BY. (Не будет выполняться на более новых версиях MySQL. Вернет произвольные данные с использованием более старых версий MySQL.) В общем правиле GROUP BY указано: Если указано предложение GROUP BY, каждая ссылка столбца в списке SELECT должна либо идентифицировать столбец группировки, либо быть аргумент функции набора! – jarlh

ответ

1

Заверните его с другим выбрать:

SELECT t.*, 
     (total/complete * 100) AS percentage 
FROM(
    SELECT 
     COUNT(UHAM.module_id) AS total, 
     COUNT(CASE WHEN UHAM.is_complete = 1 
     THEN 1 
      ELSE NULL END)  AS complete, 
     AT.name 
    FROM user_has_academy_module UHAM 
     JOIN academy_team AT ON AT.id = UHAM.academy_team_id 
    WHERE academy_team_id IN (317, 305) 
    GROUP BY UHAM.academy_team_id) t 

Вы не можете использовать псевдоним на том же уровне, она была создана, вы должны либо скопировать все выражение снова, или обернуть его с другим выбрать как в примере выше ,

1

Да, вы должны либо использовать все выражение как для count операции (OR) сделать это в внешнем запросе, как

SELECT *, (total/complete * 100) AS percentage FROM (
SELECT 
    COUNT(UHAM.module_id) AS total, 
    COUNT(CASE WHEN UHAM.is_complete = 1 
    THEN 1 
     ELSE NULL END)  AS complete, 
    AT.name 
FROM user_has_academy_module UHAM 
    JOIN academy_team AT ON AT.id = UHAM.academy_team_id 
WHERE academy_team_id IN (317, 305) 
GROUP BY UHAM.academy_team_id) XXX; 

(ИЛИ)

COUNT(UHAM.module_id) AS total, 
    COUNT(CASE WHEN UHAM.is_complete = 1 
    THEN 1 
     ELSE NULL END)  AS complete, 
    (COUNT(UHAM.module_id)/COUNT(CASE WHEN UHAM.is_complete = 1 THEN 1 
     ELSE NULL END) * 100) AS percentage, 
0
SELECT A.*,(total/complete * 100) AS percentage 
FROM 
(
SELECT COUNT(UHAM.module_id) AS total, COUNT(CASE WHEN UHAM.is_complete =    
1 THEN 1 ELSE NULL END)  AS complete FROM user_has_academy_module UHAM 
JOIN academy_team AT ON AT.id = UHAM.academy_team_id 
WHERE academy_team_id IN (317, 305) 
GROUP BY UHAM.academy_team_id 
)A 
0

Обычный способ приблизиться к этому - использовать подзапрос. Тем не менее, это довольно неэффективно в MySQL, потому что подзапрос материализуется - и это вызывает дополнительные накладные расходы при запуске запроса.

Я хотел бы предложить писать логику:

SELECT COUNT(*) AS total, 
     SUM(UHAM.is_complete = 1) as complete, 
     AVG(UHAM.is_complete = 1) as percentage 
     AT.name 
. . . 

Это использует тот факт, что MySQL рассматривает логические выражения в виде чисел в числовом контексте, с «1» для истинного и «0» для лжи.

В этой версии делается предположение, что is_complete не принимает значения NULL (в том числе эта логика будет довольно простой).

 Смежные вопросы

  • Нет связанных вопросов^_^