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
答案 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_items
中clients_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}}