#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);