Подсчет отдельных предметов в колонке MY SQL или MS SQL - PullRequest
1 голос
/ 14 апреля 2020

У меня есть данные с именем столбца Rule1 со значениями. Правильно , Неверно и Не определено

Мне удалось получить количество из них в этом конкретном столбце, используя Group BY

select Rule1, count(*) from table_name group by Rule1;

У меня есть еще один столбец Rule2 со значениями Правильно , Неправильно только когда я пытаюсь подобный оператор выбора как выше, я получаю единственное число правильных и неправильных

Я хочу получить счетчик Undefined равным нулю, поскольку в столбце Rule2 нет значения Undefined Как это сделать

Как мне написать запрос, который должен показывать количество фиксированных значений в нескольких столбцах

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Вы также можете использовать сумму следующим образом:

SELECT 
    sum(case when Rule1 = 'Correct' then 1 else 0 end) AS Rule1Correct,
    sum(case when Rule1 = 'Incorrect' then 1 else 0 end) AS Rule1Incorrect,
    sum(case when Rule1 = 'Undefined' then 1 else 0 end) AS Rule1Undefined,
    sum(case when Rule2 = 'Correct' then 1 else 0 end) AS Rule2Correct,
    sum(case when Rule2 = 'Incorrect' then 1 else 0 end) AS Rule2Incorrect  
FROM 
    table_name 
WHERE 
    1

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

Кроме того, я понятия не имею, что лучше для серверной нагрузки, это или использование союзов.

0 голосов
/ 14 апреля 2020

Вы можете создать производную таблицу, которая перечисляет возможные значения с помощью union all, а затем привести вашу таблицу с left join:

select x.rule1, count(t.rule1) cnt
from (select 'Correct' rule1 union all select 'Incorrect' union all select 'Undefined') x
left join mytable t on t.rule1 = x.rule1
group by x.rule1

Это синтаксис кросс-базы данных, который будет работать в обоих MySQL и SQL Сервер.

В самых последних версиях MySQL можно использовать синтаксис values(row ...):

select x.rule1, count(t.rule1) cnt
from (values row('Correct'), row('Incorrect'), row('Undefined')) x(rule1)
left join mytable t on t.rule1 = x.rule1
group by x.rule1

На SQL Сервер, эквивалентный запрос:

select x.rule1, count(t.rule1) cnt
from (values ('Correct'), ('Incorrect'), ('Undefined')) x(rule1)
left join mytable t on t.rule1 = x.rule1
group by x.rule1
...