programing

MySQL 행의 총계(Grandtotal)

sourcejob 2022. 9. 24. 10:22
반응형

MySQL 행의 총계(Grandtotal)

MariaDB SQL을 작성해야 합니다.이 SQL에서는 2개의 컬럼(Debit 및 Credit Columns)을 합산하여 차액을 얻을 수 있으며, 모든 계정 유형의 소계를 반환할 수 있습니다.표는 다음과 같습니다.

 Account     | Debit  | Credit
 acc1        |   1    |   2 
 acc1        |   1    |   4
 acc2        |   3    |   2
 acc2        |   2    |   1
 acc2        |   2    |   1
 acc3        |   5    |   2
 acc3        |   5    |   1
 acc3        |   5    |   2

아래 상품을 반품하고 싶습니다.

 Account     | Balance(debit-credit)
 acc1        |   -1    
 acc1        |   -3 
 -------------------------------
 Total acc1  |   -4 
 -------------------------------
 acc2        |   1
 acc2        |   1
 acc2        |   1
 -------------------------------
 Total acc2  |   3 
 -------------------------------
 acc3        |   3
 acc3        |   4
 acc3        |   3
 -------------------------------
 Total acc3  |   10 
 -------------------------------
 GrandTotal  |   9 
 -------------------------------

 Grandtotal is Totals of acc1 + acc2 + acc3

이게 내가 지금까지 해왔던 거야, 어떻게 내가 총계만 얻고 소계만 얻을 수 있지?

SELECT * FROM (
 SELECT COALESCE(account,'TOTAL') AS Account, CASE
        WHEN account LIKE 'INC%' 
            THEN sum((gl.credit - gl.debit))
        ELSE sum((gl.debit - gl.credit))
    END AS Balance
 FROM `tabGL Entry` gl
 WHERE (NOT (account LIKE 'CASS%')
     AND NOT (account LIKE 'CLIA%')
     AND NOT (account LIKE 'FASS%'))
 GROUP BY account WITH ROLLUP
) AS gl
 ORDER BY CASE
     WHEN account LIKE 'INC%' THEN 1
     WHEN account LIKE 'DCOI%' THEN 2
     WHEN account LIKE 'DMC%' THEN 3
     WHEN account LIKE 'INFC%' THEN 4
     WHEN account LIKE 'IDEX%' THEN 5
     ELSE 6
 END

와 함께 시도해 볼 수 있습니다.UNION예를 들어 다음과 같습니다.

SELECT * 
  FROM (SELECT COALESCE('TOTAL ', account) AS Account
               , SUM(CASE WHEN account LIKE 'INC%' 
                          THEN (gl.credit - gl.debit)
                          ELSE (gl.debit - gl.credit)
                      END) AS Balance
          FROM `tabGL Entry` gl
         WHERE (NOT (account LIKE 'CASS%')
           AND NOT (account LIKE 'CLIA%')
           AND NOT (account LIKE 'FASS%'))
         GROUP BY account WITH ROLLUP
  -- UNION SELECT account
  --              , CASE WHEN account LIKE 'INC%' 
  --                     THEN (gl.credit - gl.debit)
  --                     ELSE (gl.debit - gl.credit)
  --                 END AS Balance
  --         FROM `tabGL Entry` gl
  --        WHERE (NOT (account LIKE 'CASS%')
  --          AND NOT (account LIKE 'CLIA%')
  --          AND NOT (account LIKE 'FASS%'))
) AS gl
 ORDER BY CASE
 WHEN account LIKE 'INC%' THEN 1
 WHEN account LIKE 'DCOI%' THEN 2
 WHEN account LIKE 'DMC%' THEN 3
 WHEN account LIKE 'INFC%' THEN 4
 WHEN account LIKE 'IDEX%' THEN 5
 ELSE 6
END

이 정도면 네가 원하는 대로 할 수 있을 것 같아

주석 처리된 부분은 단일 행에 대한 부분이고, 위쪽 부분은 하위 합계에 대한 부분입니다.

마지막 코멘트 뒤에 서브합계와 총계를 나타내는 쿼리가 표시됩니다.

COALESCE에 의한 그룹화가 문제인 것 같았기 때문에, 현재는, 다음의 방법으로 행해지고 있습니다.LEFT(account,3)및 그ORDER문을 3자로 수정해야 했습니다.

SELECT * 
  FROM (SELECT LEFT(account,3) AS Account
           , SUM(CASE WHEN account LIKE 'INC%' 
                      THEN (credit - debit)
                      ELSE (debit - credit)
                  END) AS Balance
          FROM acc
         GROUP BY LEFT(account,3) WITH ROLLUP
) AS ac
 ORDER BY CASE
 WHEN account LIKE 'INC%' THEN 1
 WHEN account LIKE 'DCO%' THEN 2
 WHEN account LIKE 'DMC%' THEN 3
 WHEN account LIKE 'INF%' THEN 4
 WHEN account LIKE 'IDE%' THEN 5
 ELSE 6
END

언급URL : https://stackoverflow.com/questions/45582932/mysql-subtotals-of-rows-with-grandtotal

반응형