mysql> select * from table;
+------+------+------+-------+
| id | cnta | cntb | cntc |
+------+-------------+-------+
4 0 1 2
3 2 3 0
2 1 0 1
1 3 2 2
Я хотел бы сравнить две последовательные строки (текущий столбец и предыдущий столбец), и если они оба больше 0, я хотел бы суммировать результаты последовательных строк.
это то, что я пытался и не удалось:
SELECT
g1.id,
(case
When g2.cnta > 0 and g1.cnta > 0 then g1.cnta ELSE 0) End as cnta +
(case
When g2.cntb > 0 and g1.cntb > 0 then g1.cntb ELSE 0) End as cntb +
(case
When g2.cntc > 0 and g1.cntc > 0 then g1.cntc ELSE 0) End as cntc
FROM table g1 INNER JOIN table g2 ON g2.id = g1.id+ 1;
окончательный вывод, который я пытаюсь получить, выглядит следующим образом (если текущий столбец и предыдущий столбец > 0, то текущий столбец1 + и т. д.):
id totalcnt
4 1
3 2
2 2
1
Как я могу исправить свой запрос? или я могу получить альтернативный подход в качестве решения, пожалуйста?
** Я забыл упомянуть, что в моей таблице нет значений NULL. Только 0 и положительные целые числа.
да, я вычислил выход вручную сам. Версия MySQL: 5.7.21
Если ваша последняя строка результата не должна быть пустой, попробуйте следующее:
SELECT t1.id, (CASE WHEN t1.cnta>0 AND t2.cnta>0 THEN t1.cnta ELSE 0
END + CASE WHEN t1.cntb>0 AND t2.cntb>0 THEN t1.cntb ELSE 0 END+
CASE WHEN t1.cntc>0 AND t2.cntc>0 THEN t1.cntc ELSE 0 END ) AS
cValue FROM table1 t1 LEFT JOIN table1 t2 ON t2.id=t1.id-1;
ИЛИ, если вы действительно хотите, чтобы он был пустым, вы можете использовать подзапрос
SELECT t1.id,IFNULL((SELECT (CASE WHEN t1.cnta>0 AND t2.cnta>0 THEN
t1.cnta ELSE 0 END + CASE WHEN t1.cntb>0 AND t2.cntb>0 THEN
t1.cntb ELSE 0 END+ CASE WHEN t1.cntc>0 AND t2.cntc>0 THEN t1.cntc
ELSE 0 END ) FROM table1 t2 WHERE t2.id=t1.id-1),'') cValue FROM
table1 t1
Спасибо, Асгар, но ваши запросы не дали мне правильных результатов. когда текущая строка и предыдущая строка сравниваются, ТОЛЬКО ЕСЛИ обе > 0, то сумма текущей строки. и сделайте это для всех столбцов, чтобы получить все столбцы. это то, что я пытаюсь сделать.
Я пробовал те же данные, которые вы разместили на своем ноутбуке. Я разместил запрос только после проверки ваших данных.
извините, моя ошибка, после проверки еще раз, да, это работает. большое спасибо.
Мои глаза... Пожалуйста, взгляните на симпатичный SQL-принтер или даже просто разумно используйте пробел, чтобы отформатировать ваши SQL-запросы, чтобы они были читабельными.
@CaiusJard, все еще учусь отвечать :). Я ценю ваши предложения.
SELECT t1.id,
(t1.cnta * t2.cnta > 0) * t1.cnta
+ (t1.cntb * t2.cntb > 0) * t1.cntb
+ (t1.cntc * t2.cntc > 0) * t1.cntc totalcnt
FROM test t1
LEFT JOIN test t2 ON t1.id = t2.id + 1;
https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=48f296035e95bf4c7331427e82c25619
t1.cntX * t2.cntX
равно NULL, если хотя бы одно значение равно NULL, равно нулю, если хотя бы одно значение равно нулю, и равно 1, если оба значения не равны нулю/NULL.
спасибо, Акина. первое решение сработало для меня.
SELECT VERSION();
.