MySQL: функция SUM применяется к формуле, содержащейся в поле, выбранном другим запросом - PullRequest
0 голосов
/ 31 мая 2018

Мне нужно выполнить select SUM (), где это формула содержится в поле, выбранном другим запросом.Пример:

table_A (поле «формула» содержит в каждой ячейке арифметическое выражение, включающее столбцы из таблицы B):

+------------+--------------+------------+
| Product_id | related_prod |  formula   |
+------------+--------------+------------+
| U1         | C2           | col2-col1  |
| U2         | C3           | col3-col2  |
| U3         | C4           | col3-col1  |
+------------+--------------+------------+

table_B:

+------------+---------+------------+----------+------+------+------+
| Product_id | year_id | company_id | month_id | col1 | col2 | col3 |
+------------+---------+------------+----------+------+------+------+
| C2         |    2017 |          1 |        2 |  100 |  200 |  300 |
| C3         |    2017 |          1 |        2 |  400 |  500 |  600 |
| C4         |    2017 |          1 |        2 |  700 |  800 |  900 |
+------------+---------+------------+----------+------+------+------+

Затем я делаю следующий запрос:

SELECT 
SUM(totals.relaz) as final_sum, 
totals.relaz as 'col', 
totals.prod as 'prod', 
totals.cons as 'cons', 
m.company_id, m.month_id, m.year_id, FROM `table_B` m, 
    ( SELECT formula as relaz, 
     related_prod as prod,
     p.product_id as cons FROM table_A p  ) 
     AS totals 
WHERE m.product_id=totals.prod 
GROUP BY m.company_id, m.year_id, m.month_id, m.product_id, totals.cons

После выбора я бы ожидал, что, учитывая, например, единственный продукт 'U1', соответствующая строка будет

+-----------+-----------+------+------+------------+----------+---------+
| final_sum |    col    | prod | cons | company_id | month_id | year_id |
+-----------+-----------+------+------+------------+----------+---------+
|       100 | col2-col1 | C2   | U1   |          1 |        2 |    2017 |
+-----------+-----------+------+------+------------+----------+---------+

Вместо этого я получаю

+-----------+-----------+------+------+------------+----------+---------+
| final_sum |    col    | prod | cons | company_id | month_id | year_id |
+-----------+-----------+------+------+------------+----------+---------+
|         0 | col2-col1 | C2   | U1   |          1 |        2 |    2017 |
+-----------+-----------+------+------+------------+----------+---------+

то есть поле final_sum всегда установлено в 0, несмотря на то, что поле 'col' содержит правильное уравнение.

Что я делаю неправильно?

Заранее спасибо, Алекс

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Это может возможно построить хранимую процедуру, которая извлекает строку col2-col1 и вставляет ее (используя CONCAT) в строку, затем PREPAREs и EXECUTEs строку SQL.

То есть динамически создавать SQL, возможно, как в Ответе @ slaakso.

Это было бы грязно.

Мне нужно что-то подобное;Я решил сделать eval() на PHP, который был языком клиента.Я использую его для оценки VARIABLES и GLOBAL STATUS.Пример: Table_open_cache_misses / Uptime дает «промахов в секунду», который, если высокий, указывает на необходимость увеличения параметра table_open_cache.

0 голосов
/ 31 мая 2018

Вы пытаетесь получить сумму из строкового столбца (table_A.formula).Это приведет к 0. MySQL / MariaDB не будет пытаться преобразовать строки в ссылки на столбцы и вычислить формулу в строке.

Другое дело, что вы должны перечислить все столбцы не в статистической функции в GROUP BY.

Чтобы получить желаемый результат, используйте:

SELECT 
  SUM(CASE 
      WHEN a.formula = 'col2-col1' THEN b.col2-b.col1 
      WHEN a.formula = 'col3-col1' THEN b.col3-b.col1 
      WHEN a.formula = 'col3-col2' THEN b.col3-b.col2
     END
     ) AS final_sum, 
  a.formula as 'col', 
  a.related_prod as 'prod', 
  a.Product_id as 'cons', 
  b.company_id, 
  b.month_id, 
  b.year_id
FROM table_B b
  JOIN table_A a on a.related_prod=b.Product_id 
GROUP BY a.formula, a.related_prod, a.Product_id, b.company_id, b.month_id, b.year_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...