Подсчет столбцов и сумма

Я очень новичок в SQL, и у меня есть таблица с идентификатором (идентификатором вопроса) и областями риска (риск1, риск2 и риск3).

+----+-------+------+------+
| id | risk1 | risk2| risk3|
+----+-------+------+------+
| 0  |   h   |   l  |   h  |
| 1  |   m   |   l  |   l  |
| 2  |   h   |   h  |   h  |
| 3  |   l   |   l  |   h  |
+----+-------+------+------+

Моя цель - рассчитать сумму «h» для отдельных идентификаторов. Например, запрос должен возвращать «2» для id=0, «0» для id=1, «3» для id=2 и «1» для id=3. Любое предложение будет оценено.

Серьезно подумайте об изменении схемы. Таблица базы данных не является электронной таблицей

Strawberry 27.05.2019 16:58
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
51
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

MySQL обрабатывает логические выражения как числа, поэтому это легко выразить:

select id,
       ( (risk1 = 'h') + (risk2 = 'h') + (risk3 = 'h') ) as num_hs
from t;

Примечание. Это предполагает, что ни одно из значений не является NULL, что, по-видимому, имеет место с вашими данными.

В одну сторону:

SELECT
    id,
    IF(COALESCE(risk1, '') = 'h', 1, 0) +
    IF(COALESCE(risk2, '') = 'h', 1, 0) +
    IF(COALESCE(risk3, '') = 'h', 1, 0) AS h_sum
FROM yourTable
ORDER BY id;

Просто для удовольствия, вот более экзотический способ сделать это, используя манипуляции со строками:

SELECT
    id,
    3 - LENGTH(REPLACE(CONCAT(risk1, risk2, risk3), 'h', '')) AS h_sum
FROM yourTable
ORDER BY id;

Демо

Чтобы второй подход также был NULL безопасным, просто используйте COALESCE(risk1, '') вместо risk1 (и то же самое для других столбцов).

Я отвечал на что-то похожее на второй XD

Elanochecer 27.05.2019 16:27

Двигаясь на шаг вперед, как избежать «NULL» в этом расчете?

ABS2019 27.05.2019 16:29

@ABS2019 Просто используйте COALESCE(risk1, '') вместо risk1 и то же самое для других столбцов. Большинство ответов, данных здесь, уже будут работать только с этим изменением.

Tim Biegeleisen 27.05.2019 16:33
Ответ принят как подходящий

Простой [подробный] запрос:

select
  id,
  case when risk1 = 'h' then 1 end +
  case when risk2 = 'h' then 1 end +
  case when risk3 = 'h' then 1 end as sum_h
from t

Более традиционное (можно сказать «лучшее») решение может быть следующим:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL
,risk_no INT NOT NULL
,risk_type CHAR(1) NOT NULL
,PRIMARY KEY(id,risk_no)
);

INSERT INTO my_table VALUES
(1,1,'h'),
(2,1,'m'),
(3,1,'h'),
(4,1,'l'),

(1,2,'l'),
(2,2,'l'),
(3,2,'h'),
(4,2,'l'),

(1,3,'h'),
(2,3,'l'),
(3,3,'h'),
(4,3,'h');

SELECT id, COUNT(*) total FROM my_table WHERE risk_type = 'h' GROUP BY id;
+----+-------+
| id | total |
+----+-------+
|  1 |     2 |
|  3 |     3 |
|  4 |     1 |
+----+-------+

или

SELECT id, SUM(risk_type = 'h') total FROM my_table GROUP BY id;
+----+-------+
| id | total |
+----+-------+
|  1 |     2 |
|  2 |     0 |
|  3 |     3 |
|  4 |     1 |
+----+-------+

Это правильный путь, но только при условии, что ОП имеет право изменить свой дизайн (он не может).

Tim Biegeleisen 27.05.2019 17:31

Другие вопросы по теме