Разбиение строки с разделителем '+' на отдельные строки и применение агрегации - PullRequest
0 голосов
/ 16 октября 2018

Данные не являются статичными, и группа символов, разделенных +, может различаться.Я хочу, чтобы все символы, разделенные знаком +, располагались по строкам, а затем применяли агрегирование сверху.Я использую MySQL 5.7.14 в Windows.предположим, что данные:

group   val
a+b     10
a       5
b       6
b+d+c   12
d       13
c+d     12

вывод должен быть таким:

grp_item val
a        15
b        28
c        24
d        24   

1 Ответ

0 голосов
/ 16 октября 2018

Как я уже сказал, запрос MySQL сложен ..Общая идея - генератор чисел MySQL, который генерирует от 1 до 10000, поэтому он поддерживает 10000 разделенных значений со знаком + в столбце группы.И не важно, какие данные находятся между знаками +.

Запрос

SELECT 
   Table1_unique_groups.`group`
 , SUM(Table1.val)
FROM (

SELECT 
 DISTINCT
   SUBSTRING_INDEX(SUBSTRING_INDEX(Table1.`group`, '+', number_generator.number), '+', -1) AS `group`

FROM (
  SELECT 
   @row := @row + 1 AS number
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) record_1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) record_2    
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) record_4
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) record_5     
  CROSS JOIN (
    SELECT @row := 0 
  ) AS init_user_params
) AS number_generator
CROSS JOIN 
 Table1 

) AS Table1_unique_groups

INNER JOIN 
  Table1
ON
  FIND_IN_SET(Table1_unique_groups.`group`, REPLACE(Table1.group, '+', ','))

GROUP BY 
 Table1_unique_groups.`group`

Результат

| group | SUM(Table1.val) |
| ----- | --------------- |
| a     | 15              |
| b     | 28              |
| c     | 24              |
| d     | 37              |

Демо-версия DB Fiddle

...