Разделение MySQL из одной и той же колонки с разными ключами - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть таблица с 5 полями

id = это автоинкрементное поле
form_id = это поле заполняемой формы
entry_id = это идентификатор записи
meta_key = это идентификатор определенных полей формы
meta_value = это значение, введенное в поле формы

Если я сделаю:

SELECT SUM(meta_value) FROM tbl WHERE meta_key = 55;

Я получусумма всех людей, которые любят яблоки.

Если я сделаю:

SELECT SUM(meta_value) FROM tbl WHERE meta_key = 75;

Я получу сумму всех людей.

Я пытаюсьнапишите один запрос, который даст мне% людей, которые так любят яблоко ((RESULT of Q1) / (RESULT of Q2)) * 100

До сих пор я изучал самостоятельные объединения и подзапросы, но я по сути застрял сейчас, потому что все учебники по подзапросамсосредоточиться на предложении WHERE.

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

Чтобы избежать деления на ноль, я бы просто рекомендовал:

SELECT (SUM(CASE WHEN meta_key = 55 THEN meta_value ELSE 0 END) / 
        SUM(CASE WHEN meta_key = 75 THEN meta_value END)
       ) * 100 
FROM tbl 
WHERE meta_key IN (55, 75);

Обратите внимание, что второй CASE не имеет ELSE. Если совпадений нет, то возвращается NULL, избегая деления на ноль.

Тем не менее, MySQL не возвращает ошибку деления на ноль. Он просто возвращает NULL. Но это очень специфичное для базы данных поведение. Я думаю, что любая другая база данных возвращает ошибку, и вы должны знать о таких потенциальных проблемах.

0 голосов
/ 25 апреля 2018

Самое простое, что я могу придумать:

SELECT
    (SELECT SUM(meta_value) FROM tbl WHERE meta_key = 55) /
    (SELECT SUM(meta_value) FROM tbl WHERE meta_key = 75) * 100
    as percentage;

Будет ли это работать для вас?

0 голосов
/ 25 апреля 2018

Вы можете попробовать этот запрос, он исключает любую возможность division by zero, на всякий случай total = 0.

SELECT
    CASE
        WHEN b.sum_b IS NULL OR b.sum_b = 0 THEN 0
        ELSE (a.sum_a / b.sum_b) * 100
    END as percent

FROM (
    SELECT SUM(meta_value) as sum_a FROM tbl WHERE meta_key = 55
) a,

(
    SELECT SUM(meta_value) as sum_b FROM tbl WHERE meta_key = 75
) b
0 голосов
/ 25 апреля 2018

Вы можете использовать условное агрегирование

SELECT (SUM(CASE WHEN meta_key = 55 THEN meta_value ELSE 0 END) / 
        SUM(CASE WHEN meta_key = 75 THEN meta_value ELSE 0 END)) * 100 -- be careful you may got divide by zero error
FROM tbl 
WHERE meta_key IN (55, 75);

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

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