我需要执行选择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。
我做错了什么?
提前谢谢你 亚历
答案 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
。