用sum&和三个mysql表连接起来组

时间:2013-04-17 17:11:26

标签: mysql sql

我有以下三个表

  1. acc_chart_of_accounts
  2. acc_chart_of_sub_accounts
  3. acc_posting_details
  4. 表acc_chart_of_accounts被所有用户用作名义账户的入门名单,表chart_of_sub_accounts包含用户添加的任何新名义账户。表acc_posting_details包含账户交易条目。 目标是使用acc_chart_of_accounts表作为基础显示名义帐户列表,并使用每个名义代码的总和添加用户创建的任何其他名义代码,所有这些代码都由company_id过滤。 为此,我尝试了以下内容:

    我已经获取了acc_chart_of_accounts表和acc_chart_of_sub_accounts表,并将以下查询应用于下面的两个表。

    acc_chart_of_accounts

    nominal_acc_no coa_name


            10  Freehold property cost             
            20  Freehold property depreciation     
           110  Leasehold property cost            
           120  Leasehold property depreciation    
           210  Plant and machinery cost           
    

    acc_chart_of_sub_accounts

    nominal_acc_no coa_name


          1200  Bank current account  
    

    这是用于列出主表 acc_chart_of_accounts 中的名义帐户以及用户设置的子表 acc_chart_of_sub_accounts 的查询...

    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;
    

    这是它给出的结果,我删除了一些结果以使事情更容易阅读,你可以看到查询采用右表acc_chart_of_sub_accounts上的名义代码条目并将其插入到列表中左表acc_chart_of_accounts虽然在列表的末尾,我想ORDER BY会对它进行排序。

    因此,当用户在其帐户中添加新的名义帐户时,它会显示在主图表上,如下所示。

    nominal_acc_no coa_name


            10  Freehold property cost             
            20  Freehold property depreciation     
           110  Leasehold property cost            
           120  Leasehold property depreciation    
           210  Plant and machinery cost                       
           **1200  Bank current account**    
    

    我现在需要做的是将下面的表acc_posting_details添加到mix中,我需要能够将此表链接到其他两个,以便它将任何总计余额添加到返回的结果。

    post_detail_id nominal_acc_no借记贷记公司_id


             1            2109    0.00   27.00             0
             2            2200    4.00    0.00             0
             3            7000   23.00    0.00             0
             4            2109    0.00   27.00             0
             5            2200    4.00    0.00             0
             6            6100   23.00    0.00             0
    

    现在,当用户查看他们的会计科目表时,他们将看到主表中的所有名义代码以及他们可能已设置的任何其他代码以及每个名义代码可能存在的任何余额。此查询将不得不由company_id过滤,它将来自$ _SESSION值。

    以下是我使用以下代码生成的查询结果:

    SELECT
        `acc_chart_of_accounts`.`nominal_acc_no`
        , `acc_chart_of_accounts`.`coa_name`
        , SUM(`acc_posting_details`.`debit`) AS `dabit`
        , SUM(`acc_posting_details`.`credit`) AS `credit`
        , `acc_posting_details`.`company_id`
    FROM
        `acc_chart_of_accounts`
        LEFT JOIN `acc_posting_details` 
            ON (`acc_chart_of_accounts`.`nominal_acc_no` = `acc_posting_details`.`nominal_acc_no`)
    GROUP BY `acc_chart_of_accounts`.`nominal_acc_no`;
    

    nominal_acc_no coa_name借记卡贷款


            10  Freehold property cost             (NULL)  (NULL)        
            20  Freehold property depreciation     (NULL)  (NULL)        
           110  Leasehold property cost            (NULL)  (NULL)        
           120  Leasehold property depreciation    (NULL)  (NULL)        
           210  Plant and machinery cost           (NULL)  (NULL)       
           310  Fixture and fittings cost          (NULL)  (NULL)        
           320  Fixture and fittings depreciation  (NULL)  (NULL)       
           410  Motor vehicles cost                (NULL)  (NULL)        
           420  Motor vehicles depreciation        (NULL)  (NULL)       
           700  Investments                        (NULL)  (NULL)        
           900  Goodwill                           (NULL)  (NULL)        
          1000  Stock                              (NULL)  (NULL)        
          1100  Trade debtors                      (NULL)  (NULL)     
          1103  Debtors and prepayments            (NULL)  (NULL)        
          2100  Purchase ledger control            (NULL)  (NULL)        
          2109  Creditors                            0.00   54.00           
          2200  VAT control acc                      8.00    0.00            
          2300  PAYE NI Liability                  (NULL)  (NULL)        
          2600  Bank loan                          (NULL)  (NULL)        
          2700  Hire purchase                      (NULL)  (NULL)       
          2800  Lease purchase                     (NULL)  (NULL)        
          2900  Other loans                        (NULL)  (NULL)        
          3000  Capital Acc BBF                    (NULL)  (NULL)        
          3100  Capital introduced                 (NULL)  (NULL)       
          3200  Profit and loss account            (NULL)  (NULL)        
          3300  Personal drawings                  (NULL)  (NULL)       
          4000  Sales                              (NULL)  (NULL)        
          4009  Discounts allowed                  (NULL)  (NULL)        
          4100  Eport sales                        (NULL)  (NULL)        
          4200  Royalties received                 (NULL)  (NULL)       
          4210  Commisions received                (NULL)  (NULL)        
          4220  Insurance payout received          (NULL)  (NULL)       
          4230  Rental income                      (NULL)  (NULL)        
          4240  Bank interest received             (NULL)  (NULL)        
          5000  Purchases                          (NULL)  (NULL)       
          5900  Opening stock                      (NULL)  (NULL)       
          5950  Closing stock                      (NULL)  (NULL)        
          6000  Direct labour                      (NULL)  (NULL)        
          6100  Goods out cost                      23.00    0.00           
          6200  Goods in cost                      (NULL)  (NULL)        
    

    这只是读取两个帐户表,并且它没有读入acc_chart_of_sub_accounts中的额外名义帐户,但是它给出了我想要最终结果的数字。我真的很难过,所以我可以真的是伸出援助之手。 感谢

    大卫

1 个答案:

答案 0 :(得分:1)

我想也许你正在寻找一个子选择。你的问题有点漫无边际,所以我不确定。

SELECT
    A.`nominal_acc_no`
    , A.`coa_name`
    , SUM(`acc_posting_details`.`debit`) AS `dabit`
    , SUM(`acc_posting_details`.`credit`) AS `credit`
    , `acc_posting_details`.`company_id`
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
    LEFT JOIN `acc_posting_details` 
        ON (A.`nominal_acc_no` = `acc_posting_details`.`nominal_acc_no`)
GROUP BY A.`nominal_acc_no`;