如何加入多个表时的总和

时间:2015-02-25 11:32:49

标签: mysql

Bill有许多装箱单,装箱单可以有很多文章。

比尔也可以有许多文章(直接) - 通过文章中的FK。

考虑到文章可以属于文章表中的帐单,并且帐单可以有一个包含文章的装箱单,我如何总结某个帐单的商品价格?

我想要的格式是:

bill_Id; bill_articles_sum;

我需要哪些结构?我尝试了两次加入文章表(一次通过法案,第二次通过装箱单),最后弄得一团糟。

欢迎任何概念。

更新:

涉及3个表:

- bills > packing_lists > articles

但是,文章表还包含一个FK到账单(所以它既可以属于packing_lists也可以属于账单)。

我的问题是获取摘要:发票清单+总发票价格(文章总和)。

我怀疑它会有所帮助,但这里是代码:

        SELECT cli_bill_id, b1.bit_cli_pack_list_id, b1.bit_sum_excl ,
        b2.bit_id, b2.bit_sum_excl

        FROM clients_bills 
        LEFT JOIN clients_packing_list ON (clients_packing_list.cli_pack_bill_id = clients_bills.cli_bill_id) 
        LEFT JOIN bill_items b1 ON (clients_packing_list.cli_pack_list_id = b1.bit_cli_pack_list_id )
        LEFT JOIN bill_items b2 ON (b1.bit_cli_pack_list_id is null and clients_bills.cli_bill_id = b2.bit_cli_bill_id)
        group by cli_bill_id, b1.bit_cli_pack_list_id, b2.bit_id

2 个答案:

答案 0 :(得分:1)

假设aricle可以与packing_list直接相关或直接与账单相关(通过FK)

    SELECT 
    DISTINCT(a.article_id)
    FROM articles a 
    WHERE (a.bill IS NOT NULL and a.bill_id = __BILL_ID__) or (a.packing_list_id IN(
        SELECT pl.id from packing_list where pl.bill_id = __BILL_ID__
        ));

        SELECT 
   __BILL_ID__ as bill_id, 
SUM(a.price)  as bill_price_sum  FROM articles a WHERE a.id IN( __ABOVE_SELECT__ );

尽可能简单,假设您希望一次一个账单的总和。您需要将 BILL_ID 替换为适当的值。

答案 1 :(得分:1)

当我得到它时,bill_items的记录是属于所有账单的文章,bill_item直接属于账单或隐含地通过装箱单(但两者不能同时发生)。

所以,我可以想象一个像这样的简单表结构(简化一点):

create table clients_bills (cli_bill_id int primary key);
create table clients_packing_list  (cli_pack_list_id int primary key, cli_pack_bill_id int references client_bills(cli_bill_id));
create table bill_items (bit_id int primary key, bit_cli_pack_list_id int references clients_packing_list(cli_pack_list_id), bit_cli_bill_id int references clients_bills(cli_bill_id), price int);

这样的一些样本数据:

insert into clients_bills values (1);
insert into clients_bills values (2);

insert into clients_packing_list values(1, 1);
insert into clients_packing_list values(2, 1);

-- bill_items of bill 1
insert into bill_items values (1,1,null,1);
insert into bill_items values (2,1,null,1);
insert into bill_items values (3,2,null,1);
insert into bill_items values (4,null,1,1);
-- this would be invalid: insert into bill_items values (6,2,1,1);
-- bill_items of bill 2
insert into bill_items values (5,null,2,1);

为了满足您的需求,我改变了原始查询的逻辑,并尝试为bill_itemsclients_bills中的每条记录确定其SELECT bi.bit_id, COALESCE(cpl.cli_pack_bill_id, bi.bit_cli_bill_id) AS bill_id FROM bill_items bi LEFT JOIN clients_packing_list cpl ON (bi.bit_cli_pack_list_id = cpl.cli_pack_list_id) 中的相应记录。这是一个简单的连接:

SELECT COALESCE(cpl.cli_pack_bill_id, bi.bit_cli_bill_id) AS bill_id, SUM(bi.price)
FROM bill_items bi
LEFT JOIN clients_packing_list cpl ON (bi.bit_cli_pack_list_id = cpl.cli_pack_list_id)
GROUP BY COALESCE(cpl.cli_pack_bill_id, bi.bit_cli_bill_id);

一旦你拥有了这个,你就可以通过以下方式获得价格总和:

SELECT cb.cli_bill_id, SUM(bi.price)
FROM bill_items bi
LEFT JOIN clients_packing_list cpl ON (bi.bit_cli_pack_list_id = cpl.cli_pack_list_id)
RIGHT JOIN clients_bills cb ON (cpl.cli_pack_bill_id = cb.cli_bill_id
  OR bi.bit_cli_bill_id = cb.cli_bill_id)
GROUP BY cb.cli_bill_id;

注意,仅当您要求clients_bills的记录在bill_items中至少有一个相应记录时,它才有效。如果不是要求,并且允许空账,则以下内容应解决:

{{1}}