Возможно ли объединить 2 строки в 1 в mysql?

#mysql #sql #merge

#mysql #sql #слияние

Вопрос:

Мне нужно объединить несколько строк (2 строки в 1 основе по условиям) в моей таблице в одну, основанную на:

тот же custid и тот же appdate и цена = оплачено

и получите желаемый результат.

Мои данные сейчас:

 tbla
appid   custid    appdate    price   paid
1         1       10/10/20     20    null
2         2       10/10/20     10    null
3         1       11/10/20     30    null
4         3       12/10/20     20    null
5         1       13/10/20     20    null
6         1       10/10/20    null    20
7         2       11/10/20    null    10
8         1       11/10/20    null    20
9         3       12/10/20    null    20
10        1       13/10/20    null    20
 

Удалить вывод:

 tblb
appid   custid    appdate    price    paid
1         1       10/10/20     20       20     => same custid, same appdate, price=paid
2         2       10/10/20     10     null     
3         1       11/10/20     30     null     
4         3       12/10/20     20       20     => same custid, same appdate, price=paid
5         1       13/10/20     20       20     => same custid, same appdate, price=paid
7         2       11/10/20   null       10     
8         1       11/10/20   null       20     
 

Не беспокойтесь о appid.В конце я собираюсь перестроить appid, создав новую свежую таблицу.

Ответ №1:

Вы, кажется, хотите агрегации с изюминкой:

 select min(appid) as appid, custid, appdate,
       max(price) as price, max(paid) as paid
from tbla
group by custid, appdate, coalesce(price, paid);
 

Поворот заключается в обработке price / paid как одного столбца.

Вот скрипка db<>.

Обратите внимание, что в ваших образцовых данных всегда используется одно из paid значений или price NULL . Если есть исключения, то этот код может не сработать. Я бы посоветовал вам задать новый вопрос с соответствующими выборочными данными и желаемыми результатами, если это так.

Комментарии:

1. Обнаружена ошибка. Если у меня есть две строки с одинаковым идентификатором, датой, оплачено, это считается единицей https://dbfiddle.uk/?rdbms=mysql_8.0amp;fiddle=d8d046b600fe16eb91ac555b7f6c3f02 , поэтому общая сумма всех цен и всех оплаченных не будет похожа на исходную таблицу.

2. @YvetteLee . , , Это отвечает на вопрос, который вы задали здесь. Я бы посоветовал вам задать новый вопрос с соответствующими примерами данных и объяснением того, что вы хотите сделать в ситуации, которую вы описываете в комментарии. Результаты этого запроса соответствуют вашему существующему вопросу (даже если это не то, что вы действительно хотите).

Ответ №2:

Похоже, простая агрегация делает то, что вы хотите:

 select min(appid) as appid, custid, appdate, sum(price) as price, sum(paid) as paid
from mytable
group by custid, appdate
 

Комментарии:

1. В таблице 15 тыс. строк. У некоторых есть такие данные, как appid 1-5, а у некоторых — 6-10. Это не имеет отношения к min и sum . Пожалуйста, проверьте таблицу вывода. И СПАСИБО

Ответ №3:

Вы можете использовать join с union :

 with r as 
  (select t2.appid t2app, t1.appid, t1.custid, t1.appdate, t1.price, t2.paid from test t1 join test t2 on t1.custid = t2.custid and t1.appdate = t2.appdate and t1.price = t2.paid)
select r.appid, r.custid, r.appdate, r.price, r.paid from r
union
select * from test where not exists (select 1 from r where r.t2app = test.appid) and not exists (select 1 from r where r.appid = test.appid);