Я очень новичок в 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. Любое предложение будет оценено.
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
Двигаясь на шаг вперед, как избежать «NULL» в этом расчете?
@ABS2019 Просто используйте COALESCE(risk1, '')
вместо risk1
и то же самое для других столбцов. Большинство ответов, данных здесь, уже будут работать только с этим изменением.
Простой [подробный] запрос:
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 |
+----+-------+
Это правильный путь, но только при условии, что ОП имеет право изменить свой дизайн (он не может).
Серьезно подумайте об изменении схемы. Таблица базы данных не является электронной таблицей