2013-03-27 2 views
2

나는 dr_amount, cr_amount 및 이들 사이의 균형을 running_balance로 표시해야하는 general_ledger 테이블을 보유하고 있습니다. 그것이 아래에 주어진 쿼리를 작성한 이유입니다. 그러나 현재 행의 균형과 같은 각 쿼리의 결과가 나타납니다. 하지만 남은 잔금으로 결과를 산출해야합니다. 첫 번째 행 dr_balance가 20000이고 cr_balance가 5000이고 나머지 잔액이 15000이라고 가정합니다. 두 번째 행에서는 cr_balance 만 5000입니다. 결과는 공제와 함께 10000이어야하지만 결과는 -5000입니다. 이 문제를 어떻게 해결해야할지 모르겠습니다. 아무도 이것에 나를 도울 수 있습니까? 나는 네 도움이 필요하다. 여기 내 쿼리는 아래와 같습니다 :SQL에서 각 행 값을 계산하는 방법

SELECT     '' AS cost_center_id 
             , '' AS cost_center_name 
             , '' AS office_code 
             , CONVERT('2013-02-01',DATETIME) AS transaction_date 
             , '' AS accounts_head_id 
             , '' AS account_name 
             , '' AS opposite_accounts_head_id 
             , '' AS opposite_account_name 
             , 'Opening Balance' AS particulars 
             , tempOpeningBalance.dr_amount 
             , tempOpeningBalance.cr_amount 
             , '' AS voucher_no 
             , '' AS vin 
             FROM (SELECT IFNULL(mcoa.account_code,'1101010101100321') AS account_code 
               , IFNULL(mcoa.account_name,'Cash') AS account_name 
               , IFNULL(mcoa.account_type,'ASSET') AS accountType 
               , CAST(IFNULL(SUM(IFNULL(maingl.dr_balance,0)),0) AS DECIMAL(27,5)) AS dr_amount 
               , CAST(IFNULL(SUM(IFNULL(maingl.cr_balance,0)),0) AS DECIMAL(27,5)) AS cr_amount 
               FROM master_chart_of_accounts AS mcoa 
               INNER JOIN chart_of_accounts AS coa ON (mcoa.id = coa.master_chart_of_accounts_id AND mcoa.id = 80) 
               LEFT JOIN general_ledger AS maingl ON (coa.id = maingl.accounts_head_id AND coa.account_code='1101010101100321') 
               INNER JOIN 
               ( SELECT gl.accounts_head_id, MAX(gl.gl_id) AS max_gl_id, gl.office_code, gl.office_type, gl.country_id,gl.cost_center_id 
                 FROM  general_ledger AS gl 
          -- INNER JOIN voucher_info AS vi ON (gl.voucher_info_id = vi.id) 
                 -- WHERE vi.posting_date < '2013-02-01' AND 
                 WHERE gl.transaction_date < '2013-02-01' AND 
                  gl.cost_center_id IN ('BI0000000000000000000001') AND 
                  gl.country_id IN (1) AND 
                  gl.office_code IN ('UG500013') AND 
                  1=1 
               GROUP BY gl.accounts_head_id, gl.office_code, gl.office_type, gl.country_id,gl.cost_center_id 
               ORDER BY gl.accounts_head_id 
               ) AS tmpgl 
               ON ( maingl.office_code = tmpgl.office_code 
               AND maingl.office_type = tmpgl.office_type 
               AND maingl.accounts_head_id = tmpgl.accounts_head_id 
               AND maingl.country_id = tmpgl.country_id 
               AND maingl.cost_center_id = tmpgl.cost_center_id 
               AND maingl.gl_id = tmpgl.max_gl_id 
                ) 
               WHERE mcoa.account_status_id = 1 AND 
                coa.account_status_id = 1 
              ) AS tempOpeningBalance 

UNION 

SELECT  vi.cost_center_id 
     , cc.center_name AS cost_center_name 
     , gl.office_code 
     , vi.posting_date AS transaction_date 
     , vd.accounts_head_id 
     , (SELECT chart_of_accounts.account_name FROM chart_of_accounts WHERE chart_of_accounts.id = vd.accounts_head_id) AS account_name 
     , vd.opposite_accounts_head_id 
     , (SELECT chart_of_accounts.account_name FROM chart_of_accounts WHERE chart_of_accounts.id = vd.opposite_accounts_head_id) AS opposite_account_name 
     , vd.particulars 
     , gl.dr_amount AS dr_amount -- here to check 
     , gl.cr_amount AS cr_amount 
     , vi.voucher_no 
     , vi.vin 
FROM general_ledger AS gl 
INNER JOIN voucher_info AS vi 
ON (gl.voucher_info_id = vi.id) 
INNER JOIN cost_center AS cc 
ON (vi.cost_center_id = cc.id) 
INNER JOIN voucher_details AS vd 
ON (vi.id = vd.voucher_info_id) 
INNER JOIN chart_of_accounts AS coa 
ON (vd.accounts_head_id = coa.id) 

WHERE vi.posting_date BETWEEN '2013-02-01' AND'2013-02-28' 
    AND vi.voucher_status_id = 3 
    AND vd.status_id = 1 
    AND vi.office_code = 'UG500063' 
    AND coa.account_code='1101010101100321' 
    AND coa.cost_center_id = 'BI0000000000000000000001' 
ORDER BY cost_center_name 
    , office_code 
    , transaction_date; 
+0

같은 변수를 사용합니다. 예를 들어, 1 행 : dr_balance : 20000, cr_balance : 5000, 나머지 15000은 2 행의 dr_amount 여야합니다.이 경우 쿼리는 예상 된 결과를 반환합니다. 그렇지 않으면 이것을 달성하기위한 절차를 작성해야합니다. 또한 가능한 경우 명확한 아이디어를 줄 수있는 샘플 표 데이터를 여기에 붙여 넣으십시오. – learningloop

+0

@learningloop 데이터가 삽입 된 방식으로 주어진 표본을 받았습니다. 그것은 도움이 될 수 있습니까?! –

+0

사용자 Ravindra의 답변이 더 적절하고 효과적입니다. – learningloop

답변

2

은 테이블 자체가 값 같은 종류를 저장해야 내 소견으로이

SET @running_balance=0; 
SELECT dr_amount AS dr_amount 
     , cr_amount AS cr_amount 
     , @running_balance := (@running_balance + dr_amount - cr_amount) 
FROM general_ledger 
+0

답변 해 주셔서 감사합니다. 하지만 내 쿼리는 복잡한 쿼리입니다. 사실 나는 완전한 질의를하고있다. 나는 그것을보고를 위해 사용하고있다. 긴 쿼리입니다. 그러나 나는 이것에 대한 당신의 도움을 매우 기대하고 있습니다. 여기에서 내 쿼리를 편집하고 있습니다. –

+0

'union'을 직접하는 대신, 오프닝 잔액 관련 데이터를 임시 테이블에 선택하고 그 임시 테이블을 사용하여 실행중인 잔액을 계산하십시오. 내 접근 방식은 보고서 자체에서 실행중인 잔액을 처리하는 것입니다. –

+0

나는 또한 그렇게 생각했다. 그러나 나는 그것을 i-report에서 어떻게하는지 잘 모른다. 그게 내가 SQL에서 고투하고있는 이유입니다. –

관련 문제