MySQL基于Alias值添加和减去

时间:2018-04-09 10:13:10

标签: mysql sql group-by sum mariadb

我有一个基于枚举值IN / OUT计算SUM()的查询(见下文)

enter image description here

我正在尝试扩展计算并添加第二个SELECT基于 使用以下公式的TOTAL INTOTAL OUT输出:

  

BUDGET + TOTAL IN - TOTAL OUT = TOTAL PROFIT

问题是输出错误(见下文)

enter image description here

应为£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来自哪里。 任何帮助将不胜感激。

4 个答案:

答案 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;