Когда Текущий столбец и Предыдущий столбец> 0, сделайте это

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 и положительные целые числа.

окончательный результат, который я пытаюсь получить, такой Соответствует ли отображаемый желаемый вывод показанным демонстрационным данным полностью? Если нет то отрегулируйте. Если совпадают, подробно объясните, как рассчитывается каждое выходное значение. И предоставьте вывод для SELECT VERSION();.
Akina 17.05.2022 18:35

да, я вычислил выход вручную сам. Версия MySQL: 5.7.21

Max 17.05.2022 18:43
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
30
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если ваша последняя строка результата не должна быть пустой, попробуйте следующее:

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, то сумма текущей строки. и сделайте это для всех столбцов, чтобы получить все столбцы. это то, что я пытаюсь сделать.

Max 17.05.2022 18:41

Я пробовал те же данные, которые вы разместили на своем ноутбуке. Я разместил запрос только после проверки ваших данных.

Asgar 17.05.2022 18:45

извините, моя ошибка, после проверки еще раз, да, это работает. большое спасибо.

Max 17.05.2022 18:59

Мои глаза... Пожалуйста, взгляните на симпатичный SQL-принтер или даже просто разумно используйте пробел, чтобы отформатировать ваши SQL-запросы, чтобы они были читабельными.

Caius Jard 17.05.2022 21:22

@CaiusJard, все еще учусь отвечать :). Я ценю ваши предложения.

Asgar 18.05.2022 05:01
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.

спасибо, Акина. первое решение сработало для меня.

Max 17.05.2022 18:59

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