|
Объединение строк
|
|||
---|---|---|---|
#18+
Доброго времени суток, форумчане. Видел уже множество тем на этом форуме по объединению строк, с помощью group_by, xml path, string_agg, но так и не получилось выродить у меня решение моей проблемы. Прошу прощения, но к сожалению пришлось-таки создать топик. К сути: Есть огромное множество строк в таблице, среди них 4 (допустим) строки принадлежат одному человеку. То есть, в одной строке имеется ФИО, в другой строке имеется почта, в третьей строке имеется телефон, в четвертой-клиент айди (клиент айди имеется у всех четырех строк). При этом, те значения, которых нет в какой-либо строке это NULL. Нужно все четыре строки объединить в одну, при этом клиент айди сделать такой, который был в самой первой строке. И так во всей таблице. Например как в скриншоте. (который я не вижу чтобы загрузился) Версия sql 17 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:34 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested, а где скриншот? Ну по всей логике сначала нужно построить таблицу со всеми возможными столбцами, а затем уже заполнить ее. Таблица может быть временной )) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:40 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Oleg_SQL, Скриншот не получается по каким-то причинам прикрепить.Тогда приведу пример в текстовом виде: Имеется такое: Код: plsql Необходимо получить: Код: plsql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:47 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested, Например как в скриншоте. (который я не вижу чтобы загрузился) на нет и суда нет. ваше описание задачи слишком размытое, прикладывайте тестовые данные и результат который хотите получить. add: опередили третьим постом. ну в таком случае как должен выглядеть результат вот с такими данными ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:49 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested Oleg_SQL, Скриншот не получается по каким-то причинам прикрепить.Тогда приведу пример в текстовом виде: Имеется такое: Код: plsql Необходимо получить: Код: plsql 1. 2.
А как тоже самое будет выглядеть на нескольких клиентах? Какие правила деления записей на отдельных клиентов? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:50 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
felix_ff, Сообщение выше не подойдет? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:51 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
msLex, Я думаю, что можно было бы это сделать по условию совпадения, если фио/дата рождения/почта совпадают, то это 1 клиент Например, если есть три строки, в которых есть одна и та же почта-схлопнуть их в одну. Или же если почты нет, а есть одинаковый телефон-также объединить в одну строку. Ну или ФИО+дата рождения (хотя даже в таком случае могут существовать несколько человек с такими же ФИО+дата рождения, поэтому такой вариант не подойдет скорее всего) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:54 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested msLex, Я думаю, что можно было бы это сделать по условию совпадения, если фио/дата рождения/почта совпадают, то это 1 клиент Например, если есть три строки, в которых есть одна и тоже почта-схлопнуть их в одну. Или же если почты нет, а если телефон-также объединить в одну строку. Ну или ФИО+дата рождения (хотя даже в таком случае могут существовать несколько человек с такими же ФИО+дата рождения, поэтому такой вариант не подойдет скорее всего) А если у одного ФИО окажется несколько телефонов или email-ов? А если к этим телефонам или email-ам привязаны другие телефоны, email-ы, ФИО? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:57 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested, приведите структуру таблицы и тестовые данные. вы говорите что есть ФИО и дата рождения а приводите в виде тестовых данных какое то подобие где есть только name идентификатор client_id у вас нифига не идентификатор, а какой то сквозной нумератор. я пока не понимаю структуру данных хранящихся у вас в таблице. такое впечатление что там набор строк вида ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 16:59 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
msLex, В таком случае, у этого человека будет несколько клиент_айди и это будет правильно ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 17:00 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
felix_ff, Таблица состоит из столбцов: client_id, phone, surname, firstname, sex, date_birthday, age, city, e-mail, timezone, sum_amount Я привел выше пример для простоты, чтобы не вдаваться в подробности и понять логику, как это сделать, но, видимо, нужно все ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 17:06 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested msLex, В таком случае, у этого человека будет несколько клиент_айди и это будет правильно Не сомневаюсь, что это правильно, но не понимаю, как в вашей задачи это разделение происходит. Например Код: plaintext 1. 2. 3. 4. 5. 6.
Сколько это клиентов и где чьи телефоны и email? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 17:06 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
msLex, Ну в Вашем примере не совсем верно, такого примера просто не может быть, т.к. EMAIL1 не может быть одновременно сразу у NAME1, NAME2, NAME3, NAME4 Правильный пример такой: NAME1 PNONE1 NULL NAME2 PNONE2 NULL NAME3 NULL EMAIL3 NAME4 NULL EMAIL4 NULL PHONE1 EMAIL1 NULL PHONE2 EMAIL2 Результат: NAME1 PNONE1 EMAIL1 NAME2 PHONE2 EMAIL2 NAME3 NULL EMAIL3 NAME4 NULL EMAIL4 В конечном итоге, нужно чтобы эти строки объединялись по выполняемым условиям. Т.е. имеется минимальный набор условий, при которых строки объединяться, например в двух строках совпадают 4 столбца, как минимум. Например это surname, firstname, sex, date_birthday ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 17:12 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested felix_ff, Таблица состоит из столбцов: client_id, phone, surname, firstname, sex, date_birthday, age, city, e-mail, timezone, sum_amount Я привел выше пример для простоты, чтобы не вдаваться в подробности и понять логику, как это сделать, но, видимо, нужно все я образно понимаю чего вы хотите добиться, но не до конца понятна логика отделения данных одного человека от другого idnamephonemail1Вася21111@iv.ru3Петя22243332@iv.ru5Коля6Миша3@iv.ru74@iv.ru87779Юра9994@iv.ru10888 idnamephonemail1Вася1111@iv.ru3Петя222;3332@iv.ru5Коля6Миша7773@iv.ru;4@iv.ru9Юра888;9994@iv.ru вы вот такого хотите добиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 17:17 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested msLex, Ну в Вашем примере не совсем верно Мой пример полностью укладывается в вашу структуру данных, а значит, с точки зрения возможных данных, он абсолютно верен. Если это не какой-нибудь тестовый набор данных, генерируемый на основе изначально нормализованных данных, а данные вносимые пользователями, то подобные коллизии неизбежны. А значит вам нужно придумать некую стратегию по их корректной интерпретации. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 17:20 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested msLex, Ну в Вашем примере не совсем верно, такого примера просто не может быть, т.к. EMAIL1 не может быть одновременно сразу у NAME1, NAME2, NAME3, NAME4 Правильный пример такой: NAME1 PNONE1 NULL NAME2 PNONE2 NULL NAME3 NULL EMAIL3 NAME4 NULL EMAIL4 NULL PHONE1 EMAIL1 NULL PHONE2 EMAIL2 Результат: NAME1 PNONE1 EMAIL1 NAME2 PHONE2 EMAIL2 NAME3 NULL EMAIL3 NAME4 NULL EMAIL4 В конечном итоге, нужно чтобы эти строки объединялись по выполняемым условиям. Т.е. имеется минимальный набор условий, при которых строки объединяться, например в двух строках совпадают 4 столбца, как минимум. Например это surname, firstname, sex, date_birthday Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
и так добавляете еще кучу связей по которым могут быть совпадения ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 17:33 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
felix_ff, немного не так. Простите меня, за мои тщетные попытки объяснить, но я попробую снова, но уже детально. Имеется: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Схлопывание дублей происходит конкретно, если в двух и более строках одинаковы phone и sum_amount. В противном случае-если соответствий у одной строки с другими по phone и sum_amount не найдено, то ее не трогать и это не считается дублем. Результат: Код: plsql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 17:59 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
msLex, Нет, эти данные не вносятся пользователями, они произрастают из другой черновой таблицы, которая проходит "очистку" определнными процессами. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 18:01 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
felix_ff, Большое спасибо, пока что мало что понятно, но буду сейчас пытаться разобрать Ваш код) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 18:03 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested, Тогда сделайте временную таблицу с уникальными phone и sum_amount и на основе ее, заполняйте остальные поля ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 18:13 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 18:41 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
тоже работает, но если четко соблюдается наличие уникальных пар phone+amount :) использовал таблицу от felix_ff Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2020, 19:42 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
felix_ff, Прошу прощения, может вопрос глупый, но я так понимаю, Вы создаете таблицу и вносите туда значения: автор Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Я так понимаю, в моём случае, раз у меня уже есть таблица с моими значениями, мне этого делать не надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 14:57 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested, правильно понимаете, я просто привел пример тестовых данных как оно в принципе должно выглядеть, а вам уже нужно самому модифицировать запрос на использование не @t таблицы, а вашей реальной ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 15:04 |
|
Объединение строк
|
|||
---|---|---|---|
#18+
Nevillested, вообще-то, ваша задача, судя по приведенному примеру, описанию и результату от 10 ноя 20, 17:59 достаточно просто раскладывается на : 1) простой select с группировкой phone и sum_amount, где phone и sum_amount "не равны null" (или "не пустые") что- то типа Код: sql 1. 2. 3.
2) плюс, используя union all, собираем все оставшиеся строки, которые не схлопнулись по sum_amount , phone обычным select -ом Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2020, 18:52 |
|
|
start [/forum/topic.php?fid=46&msg=40016867&tid=1685417]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
78ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 190ms |
0 / 0 |