MySQL группа по полю получена с регулярным выражением - PullRequest
0 голосов
/ 29 мая 2019

Из исходной таблицы с идентификатором транзакции и суммой транзакции мне нужно получить итоговые суммы, сгруппированные по идентификаторам.

Суть в том, что к идентификаторам может или не может быть добавлен суффикс '_rebate'.

Мне нужно игнорировать его, и я могу удалить его с помощью регулярных выражений, но затем GROUP BY перестает работать.

То есть запрос

SELECT contract, REGEXP_SUBSTR(alias_id, '.+?(?=_rebate|$)') as alias_id, sum
FROM yt_reportLIMIT 10

возвращает

+-----------+----------------------------------+-------+
| contract  | alias_id                         | sum   |
+-----------+----------------------------------+-------+
| 187453/19 | 758ad57482d621f9b54d67f07b543f46 |  70.8 |
| 187453/19 | 3df373604d0b3f38aca283083468efd5 | 146.4 |
| 187453/19 | 3c6caf755f4e16c798c262ed06a735b3 |  70.8 |
| 187453/19 | 197358f0e522224f9a4e0b24ec265cfc | 139.2 |
| 187453/19 | 0815b324b5e81a199a984442f4d42bc8 |  93.6 |
| 187453/19 | 9e5203f585d622b0a95fc31c2e1a19be | 153.6 |
| 187453/19 | d1e1bbd7302233deac6e18107cac541f |  87.6 |
| 187453/19 | dd92fae2fc9c1fc7b208821f2f913724 | 127.2 |
| 187453/19 | b250e741e4e118fe8289e37f4bfd8523 | 148.8 |
| 187453/19 | 7bf53c61ca61162cb6f1406992acfdff |    96 |
+-----------+----------------------------------+-------+

но

SELECT te.contract, te.alias_id, ROUND(SUM(te.sum),2) as b_sum 
FROM 
(SELECT contract, REGEXP_SUBSTR(alias_id, '.+?(?=_rebate|$)') as alias_id, sum 
FROM yt_report LIMIT 10) as te
GROUP BY te.alias_id, te.contract LIMIT 10

возвращает

+-----------+----------+---------+
| contract  | alias_id | b_sum   |
+-----------+----------+---------+
| 187453/19 |          | 1134.00 |
+-----------+----------+---------+

В таблице нет идентификаторов NULL. Похоже, что запрос обработанного регулярным выражением поля из подзапроса не работает.

Как это можно решить?

1 Ответ

1 голос
/ 29 мая 2019

Вы хотите сгруппировать по замещенной строке, используя te.alias_id, сгруппируйте по исходному значению, а с помощью alias_id все равно сгруппируйте по исходному значению, поскольку имена столбцов предшествуют псевдонимам столбцов.

Итак,

  • Используйте псевдоним другого столбца и используйте его в предложении GROUP BY
  • или используйте то же выражение замены в предложении GROUP BY
  • , либо используйте синтаксис номера столбца:
SELECT contract
     , REGEXP_SUBSTR(alias_id, '.+?(?=_rebate|$)') as alias_id
     , round(sum(sum),2) sum
FROM yt_report
GROUP BY contract, 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...