Как агрегировать на основе подстрок в столбце? - PullRequest
0 голосов
/ 05 апреля 2019

Я работаю с таблицей в таком формате:

  • NUMBER |СТРАНА
  • 5 |Германия, США, Китай
  • 1 |Германия, Китай, Япония
  • 4 |Китай, Индия, Бразилия
  • 3 |Нигерия
  • 8 |Бразилия

У меня есть еще одна таблица со следующими странами:

  • СТРАНА |
  • Германия |
  • Китай |
  • Бразилия |
  • Индия |
  • Нигерия |
  • США |
  • Япония |

Теперь я хочу подвести итог совокупностиNUMBER в зависимости от страны, поэтому результат будет выглядеть примерно так:

  • COUNTRY |SUM
  • Германия |6 <5 + 1>
  • Китай |5 <1 + 4>
  • Бразилия |12
  • Индия |4
  • Нигерия |3
  • US |5
  • Япония |1

В реальных таблицах гораздо больше столбцов и более 5000 записей в каждой.

Моя логика состоит в том, чтобы выбрать каждую страну из второй таблицы и сделать LIKE со вторым столбцом первой таблицы и агрегировать числа для совпадений, но я не слишком уверен, как это реализовать.Любое руководство приветствуется.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

У вас ужасный формат данных. Первая таблица действительно должна быть таблицей соединения / ассоциации. Способ хранения списков в SQL - это строки в таблице, а не разделенные запятыми строки.

Тем не менее, иногда мы застряли с очень-очень плохими дизайнерскими решениями других людей. MySQL предлагает find_set_set() в качестве удобной функции в этом случае:

select c.country, sum(n.number)
from countries c left join
     numbers n
     on find_in_set(c.country, replace(n.country, ', ', ',')) > 0
group by c.country;
0 голосов
/ 05 апреля 2019

Вы можете использовать операторы объединения для объединения и функцию суммирования для получения суммы по каждой стране.

  SELECT C.Country, SUM(CN.Number)
  FROM Table1 CN
  INNER JOIN Table2 C ON CN.Country LIKE CONCAT('%', C.Country,'%')
  GROUP BY C.Country
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...