简体   繁体   English

重写mysql语句 - 选择左连接别名union join减法问题

[英]Re-writing mysql statement - select left join alias union join subtraction issue

I am thinking of the best way to re-write this: 我在考虑重写这个的最好方法:

SELECT
debits.account_title, debits.total - credits.total AS net_reduction
FROM 
    (
SELECT SUM(a) FROM
(
SELECT SUM(mainaccount_a_2017.amount) AS a FROM `mainaccount_a_2017`
LEFT JOIN chart_of_account ON (chart_of_account.joint_account_numbers = mainaccount_a_2017.joint_account_number)
LEFT JOIN asset_liability_income_expenditure_tbl ON (asset_liability_income_expenditure_tbl.a_l_code = chart_of_account.account_type)
WHERE mainaccount_a_2017.dr_cr_action = 'DR' AND asset_liability_income_expenditure_tbl.a_l_code = 'IN'

UNION ALL

SELECT SUM(mainaccount_b_2017.amount) AS a FROM `mainaccount_b_2017`
LEFT JOIN chart_of_account ON (chart_of_account.joint_account_numbers = mainaccount_b_2017.joint_account_number)
LEFT JOIN asset_liability_income_expenditure_tbl ON (asset_liability_income_expenditure_tbl.a_l_code = chart_of_account.account_type)
WHERE mainaccount_b_2017.dr_cr_action = 'DR' AND asset_liability_income_expenditure_tbl.a_l_code = 'IN'
)a
  )AS debits
JOIN
   (
SELECT SUM(a) FROM
(
SELECT SUM(mainaccount_a_2017.amount) AS a FROM `mainaccount_a_2017`
LEFT JOIN chart_of_account ON (chart_of_account.joint_account_numbers = mainaccount_a_2017.joint_account_number)
LEFT JOIN asset_liability_income_expenditure_tbl ON (asset_liability_income_expenditure_tbl.a_l_code = chart_of_account.account_type)
WHERE mainaccount_a_2017.dr_cr_action = 'CR' AND asset_liability_income_expenditure_tbl.a_l_code = 'IN'

UNION ALL

SELECT SUM(mainaccount_b_2017.amount) AS a FROM `mainaccount_b_2017`
LEFT JOIN chart_of_account ON (chart_of_account.joint_account_numbers = mainaccount_b_2017.joint_account_number)
LEFT JOIN asset_liability_income_expenditure_tbl ON (asset_liability_income_expenditure_tbl.a_l_code = chart_of_account.account_type)
WHERE mainaccount_b_2017.dr_cr_action = 'CR' AND asset_liability_income_expenditure_tbl.a_l_code = 'IN'
)a
   )AS credits
ON debits.account_title = credits.account_title

Try this: 尝试这个:

SELECT B.account_title, 
       SUM(CASE WHEN A.dr_cr_action = 'CR' THEN A.amount * -1 ELSE A.amount END) AS net_reduction 
FROM (SELECT A.joint_account_number, A.dr_cr_action, A.amount 
      FROM mainaccount_a_2017 A 
     UNION ALL 
      SELECT B.joint_account_number, B.dr_cr_action, B.amount 
      FROM mainaccount_b_2017 B 
     ) AS A 
INNER JOIN chart_of_account B ON A.joint_account_number = B.joint_account_numbers 
WHERE B.account_type = 'IN' 
GROUP BY B.account_title;

Check the SQL FIDDLE DEMO : 检查SQL FIDDLE DEMO

::OUTPUT:: :: OUTPUT ::

|           account_title | net_reduction |
|-------------------------|---------------|
| OTHER GRANTS AND GIFTS  |        301200 |

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM