MySQL:SUM函数应用于另一个查询

时间:2018-05-31 10:37:36

标签: mysql mariadb

我需要执行选择SUM(),其中包含在由另一个查询选择的字段中的公式。 例如:

table_A(“公式”字段在每个单元格中包含一个涉及表B中列的算术表达式):

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

表-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 |
+-----------+-----------+------+------+------------+----------+---------+

即。尽管'col'字段包含正确的等式,但final_sum字段始终设置为0。

我做错了什么?

提前谢谢你 亚历

2 个答案:

答案 0 :(得分:0)

您正在尝试从字符串列(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

答案 1 :(得分:0)

可能可以构建一个Stored例程来获取字符串col2-col1并将其(使用CONCAT)插入字符串,然后PREPAREs和{ {1}} SQL字符串。

也就是说,动态构建SQL,也许就像在@sakakso的答案中一样。

这会很混乱。

我需要这样的东西;我选择在PHP中使用EXECUTEs,这是客户端语言。我用它来评估eval()VARIABLES。示例:GLOBAL STATUS给出“每秒未命中数”,如果设置为高,则表示需要增加设置Table_open_cache_misses / Uptime