我有一个基于枚举值IN / OUT计算SUM()
的查询(见下文)
我正在尝试扩展计算并添加第二个SELECT
基于
使用以下公式的TOTAL IN
和TOTAL OUT
输出:
BUDGET + TOTAL IN - TOTAL OUT = TOTAL PROFIT
问题是输出错误(见下文)
应为£17,408.90
我试图扩展的查询是:
SELECT
f.id_festival AS ID,
CONCAT('£ ', FORMAT(f.festival_budget, 2)) AS Budget,
CONCAT('£ ', ROUND(SUM(CASE WHEN p.pmt_type = 'Payment IN' THEN p.pmt_amount ELSE 0 END), 2)) AS `TOTAL IN`,
CONCAT('£ ', ROUND(SUM(CASE WHEN p.pmt_type = 'Payment OUT' THEN p.pmt_amount ELSE 0 END), 2)) AS `TOTAL OUT`,
(SELECT
CONCAT('£ ', ROUND(SUM(f.festival_budget + 'TOTAL IN') - 'TOTAL OUT', 2))) AS PROFIT
FROM festival f
INNER JOIN payment p
ON p.id_festival = f.id_festival
WHERE f.id_festival = 1
GROUP BY f.id_festival
我无法弄清115.000来自哪里。 任何帮助将不胜感激。
答案 0 :(得分:2)
'Total In'
是一个字符串。如果在数值表达式中使用它,则MySQL会将其转换为数字。这个数字是0
。字符串'Total In'
与别名为Total In
的列没有任何关系。
在MySQL中,在表达式中使用表别名基本上有两种选择:(1)重复表达式。 (2)使用CTE。
SELECT f.id_festival AS ID,
CONCAT('£ ', FORMAT(f.festival_budget, 2)) AS Budget,
CONCAT('£ ', ROUND(SUM(CASE WHEN p.pmt_type = 'Payment IN' THEN p.pmt_amount ELSE 0 END), 2)) AS `TOTAL IN`,
CONCAT('£ ', ROUND(SUM(CASE WHEN p.pmt_type = 'Payment OUT' THEN p.pmt_amount ELSE 0 END), 2)) AS `TOTAL OUT`,
CONCAT('£ ',
ROUND(f.festival_budget +
SUM(CASE WHEN p.pmt_type = 'Payment IN' THEN p.pmt_amount
WHEN p.pmt_type = 'Payment OUT' THEN - p.pmt_amount
ELSE 0
END),
2)
) AS PROFIT
FROM festival f INNER JOIN
payment p
ON p.id_festival = f.id_festival
WHERE f.id_festival = 1
GROUP BY f.id_festival;
确实,在某些情况下,您可以在子查询中使用别名来获得相同的效果。但我不建议这样做,因为我没有找到保证这可行的文档。
答案 1 :(得分:1)
不需要子选择:
SELECT
f.id_festival AS ID,
CONCAT('£ ', FORMAT(f.festival_budget, 2)) AS Budget,
CONCAT('£ ', ROUND(SUM(CASE WHEN p.pmt_type = 'Payment IN' THEN p.pmt_amount ELSE 0 END), 2)) AS `TOTAL IN`,
CONCAT('£ ', ROUND(SUM(CASE WHEN p.pmt_type = 'Payment OUT' THEN p.pmt_amount ELSE 0 END), 2)) AS `TOTAL OUT`,
CONCAT('£ ',
ROUND(
f.festival_budget
+ROUND(SUM(CASE WHEN p.pmt_type = 'Payment IN' THEN p.pmt_amount ELSE 0 END), 2)
-ROUND(SUM(CASE WHEN p.pmt_type = 'Payment OUT' THEN p.pmt_amount ELSE 0 END), 2)
, 2)
) AS `PROFIT`
FROM festival f
INNER JOIN payment p
ON p.id_festival = f.id_festival
WHERE f.id_festival = 1
GROUP BY f.id_festival
答案 2 :(得分:0)
试试这段代码: -
SELECT
f.id_festival AS ID,
CONCAT('£ ', FORMAT(f.festival_budget, 2)) AS Budget,
CONCAT('£ ', ROUND(SUM(CASE WHEN p.pmt_type = 'Payment IN' THEN p.pmt_amount ELSE 0 END), 2)) AS `TOTAL_IN`,
CONCAT('£ ', ROUND(SUM(CASE WHEN p.pmt_type = 'Payment OUT' THEN p.pmt_amount ELSE 0 END), 2)) AS `TOTAL_OUT`,
(SELECT
CONCAT('£ ', ROUND(SUM(f.festival_budget + 'TOTAL_IN') - 'TOTAL_OUT', 2)) AS PROFIT
FROM festival f
INNER JOIN payment p
ON p.id_festival = f.id_festival
WHERE f.id_festival = 1
GROUP BY f.id_festival
答案 3 :(得分:0)
请尝试:
SELECT ID, Budget, `TOTAL IN`, `TOTAL OUT`, CONCAT('£ ', ROUND(SUM((Budget + `TOTAL IN`) - `TOTAL OUT` ))) AS PROFIT FROM
(SELECT f.id_festival AS ID,
CONCAT('£ ', FORMAT(f.festival_budget, 2)) AS Budget,
CONCAT('£ ', ROUND(SUM(CASE WHEN p.pmt_type = 'Payment IN' THEN p.pmt_amount ELSE 0 END), 2)) AS `TOTAL IN`,
CONCAT('£ ', ROUND(SUM(CASE WHEN p.pmt_type = 'Payment OUT' THEN p.pmt_amount ELSE 0 END), 2)) AS `TOTAL OUT`,
FROM festival f
INNER JOIN payment p
ON p.id_festival = f.id_festival
WHERE f.id_festival = 1
GROUP BY f.id_festival) a;