Mysql连接三个表,第三个表上有一个WHERE



我有三个表需要连接以显示以下内容
我可以加入前两个,并用这个查询显示所有唯一的nomial_acc_no

SELECT nominal_acc_no,coa_name FROM
(
    SELECT nominal_acc_no ,coa_name FROM acc_chart_of_accounts
    UNION
    SELECT nominal_acc_no,coa_name FROM acc_chart_of_sub_accounts
) A;

但我正在努力解决如何加入第三个并输出下面显示的结果。我需要对nomial_acc_no进行分组,并将借方和;acc_posting_details表中company_id上带有WHERE的credit。感谢所有的帮助。

 Acc_chart_of_accounts           
Coa_id   nominal_acc_no 
    1           10   
    2           20        
acc_chart_of_sub_accounts
coa_sub_id    nominal_acc_no  company_id
      1             10                 1
      2             20                 1
      3             110                1

Acc_posting_details
Id         nominal_acc_no   debit    credit  company_id
1              10           25.00                1
2              10           15.00                1
3              20                    30.00       1
4              110          10.00                1
5              110           8.00                1
Result
Nominal_acc_no        debit       credit    company_id
10                    40.00         -           1
20                      -         30.00         1
110                   18.00         -           1
SELECT
  acsa.nominal_acc_no,
  IFNULL(sum(apd.debit),0) AS debit,
  IFNULL(sum(apd.credit),0) AS credit,
  acsa.company_id
FROM acc_chart_of_sub_accounts AS acsa
  LEFT JOIN acc_posting_details AS apd
    ON acsa.nominal_acc_no = apd.Nominal_acc_no
GROUP BY acsa.nominal_acc_no, acsa.company_id

输出

Nominal_acc_no        debit     credit    company_id
-----------------------------------------------------
10                    40.00     0           1
20                    0         30.00       1
110                   18.00     0           1   

编辑:我在查询中修复了一个别名问题

SQL Fiddle演示在这里

SELECT Nominal_acc_no,SUM(debit) AS total_debit,SUM(credit) AS total_credit from   Acc_posting_details group by nominal_acc_no;

您可以在分组之前插入其他where条件。

您能显示表的完整结构,即所有列吗?

您的第一个SELECT语句引用了表acc_chart_of_accountsacc_chart_of_sub_accounts中的列coa_name,但在这些表的描述中没有提及该列。这让我觉得可能还缺少其他相关信息。

acc_chart_of_accountsacc_chart_of_sub_accounts表是否包含任何借项或贷项?如果没有,你为什么需要他们的信息?根据我从你的问题中了解到的情况,Acc_posting_details似乎拥有你需要的所有信息:

"我需要对nomial_acc_no进行分组,并用acc_posting_details表中company_id的WHERE">

这个查询能解决你的问题吗?

 SELECT Nominal_acc_no,
        SUM(debit) AS total_debit,
        SUM(credit) AS total_credit,
        company_id
 FROM Acc_posting_details
 WHERE company_id = 1
 GROUP BY nominal_acc_no;

添加了:

如果我理解你的最后一条评论,你需要为acc_chart_of_accounts中存在的每个Nominal_acc_no获得一行。

在这种情况下,Acc_posting_details没有您需要的所有信息,因为一些名义账户可能没有借项或贷项,因此它们不存在于Acc_posting_details中。

 SELECT aca.Nominal_acc_no,
        IFNULL(SUM(apd.debit),0) AS total_debit,
        IFNULL(SUM(apd.credit),0) AS total_credit,
        aca.company_id
 FROM acc_chart_of_accounts aca
 LEFT OUTER JOIN Acc_posting_details apd
              ON aca.Nominal_acc_no = apd.Nominal_acc_no
 WHERE aca.company_id = 1
 GROUP BY aca.nominal_acc_no;

此查询将为acc_chart_of_accounts中的每个名义帐户提供一行。如果帐户在Acc_posting_details中有任何行,您将把它们的贷项和借项加在一起。对于在Acc_posting_details中没有记录的帐户,您将在total_debit和total_credit列中获得0。

你说你想在WHERE冲突中使用company_id。或者,如果您想要一份关于所有公司的完整报告,您可以删除WHERE子句,并将GROUP BY子句替换为

 GROUP BY aca.nominal_acc_no, aca.company_id;

这就是你想要的吗?如果有效,请告诉我。

最新更新