source

MySQL Alias 값을 기반으로 한 더하기 및 빼기

bestscript 2023. 1. 6. 19:50

MySQL Alias 값을 기반으로 한 더하기 및 빼기

계산 중인 질문이 있습니다.SUM()열거값 IN/OUT에 근거합니다(아래 참조).

여기에 이미지 설명 입력

계산을 연장하고 1초를 더하려고 합니다.SELECT에 의거하여TOTAL IN그리고.TOTAL OUT다음 식을 사용하여 출력합니다.

예산 + Total In - Total Out = Total PROF- 그렇죠 - 기초부터 시작하자

문제는 출력이 잘못되었다는 것입니다(아래 참조).

여기에 이미지 설명 입력

그럴 것 같네요.£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이 어디서 왔는지 모르겠어요어떤 도움이라도 주시면 감사하겠습니다.

'Total In'는 문자열입니다.숫자 표현식으로 사용할 경우 MySQL은 이를 숫자로 변환합니다.그리고 그 숫자는0. 문자열'Total In'에일리어스가 다음과 같은 컬럼과는 전혀 관계가 없습니다.Total In.

MySQL 에서는, 식내의 테이블 에일리어스를 사용하는 경우는, 기본적으로 다음의 2개의 선택지가 있습니다. (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;

경우에 따라서는 서브쿼리에서 에일리어스를 사용하여 동일한 효과를 얻을 수 있습니다.그러나 이것이 작동한다는 것을 보증하는 문서를 찾지 못했기 때문에 권장하지 않습니다.

하위 선택 불필요:

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

다음 코드를 사용해 보십시오.-

 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

시험해 보세요:

 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;

언급URL : https://stackoverflow.com/questions/49730517/mysql-add-and-subtract-based-on-alias-value