sql左联接提供重复的多个值
朋友们,我无法取得正确的结果,请建议,提前感谢。 我有两张桌子,试图平衡数量 一个是采购表采购详情 二是销售表销售明细表 使用左连接后 SQL: 结果-但这是不正确的 结果-应该是sql左联接提供重复的多个值,sql,postgresql,left-join,Sql,Postgresql,Left Join,朋友们,我无法取得正确的结果,请建议,提前感谢。 我有两张桌子,试图平衡数量 一个是采购表采购详情 二是销售表销售明细表 使用左连接后 SQL: 结果-但这是不正确的 结果-应该是 尝试此未经测试的查询: select pur_item, sum(as bal_qty) from ( select pur_item, sum(a.pur_qty) as bal_qty from purchase_item_qty_amount a group by 1 union select pur_i
尝试此未经测试的查询:
select pur_item, sum(as bal_qty) from (
select pur_item, sum(a.pur_qty) as bal_qty
from purchase_item_qty_amount a
group by 1
union
select pur_item, sum(b.sold_qty)as bal_qty
from sale_item_qty_amount b
group by 1)
group by 1
您必须使用union而不是join,因为左边的行右边有多个匹配项,这会导致计算太多数据。尝试在不使用sum和group by的情况下运行查询,以查看正在计算的原始数据,您将了解我的意思 您的查询没有组/总和:
select a.pur_item, a.pur_qty, b.sold_qty from purchase_item_qty_amount a left join sale_item_qty_amount b on a.pur_item = b.sale_item where a.pur_item IN (12792,133263);
下面是一个查询,其工作原理与您预期的一样:
select item, sum(a.pur_qty) + sum(a.sold_qty) as bal_qty from (select pur_item as item, sum(pur_qty) as pur_qty, 0 as sold_qty from purchase_item_qty_amount where pur_item in (12792,133263) group by pur_item union select sale_item as item, 0 as pur_qty, sum(sold_qty) as sold_qty from sale_item_qty_amount where sale_item in (12792,133263) group by sale_item) a group by item;
这是你问题的全部模拟,试试这个你会得到你想要的结果:-
purchase table
create table pt(Pur_Date date,Item_Id number, Pur_Qty number)
insert into pt values('08.oct.2014',12792,25);
insert into pt values('01.nov.2014',133263,20);
insert into pt values('01.oct.2014',133263,2);
insert into pt values('20.nov.2014',12792,10);
sales table
create table st(Sale_Date date , Item_Id number, Sale_Qty number)
insert into st values('17.nov.2014',133263,-6);
insert into st values('05.nov.2014',12792,-1);
insert into st values('24.nov.2014',133263,-2);
insert into st values('28.oct.2014',12792,-6);
insert into st values('05.nov.2014',133263,-2);
select purchase.Item_Id,(purchase.pur_qty+sale.sale_qty) bal_qty
from
(
select a.Item_Id, sum(a.pur_qty) pur_qty
from pt a
group by a.Item_Id
) purchase
left join
(
select b.Item_Id,
sum(b.sale_qty ) sale_qty
from st b
group by b.Item_Id
) sale
on sale.Item_Id = purchase.Item_Id
where purchase.Item_Id in (12792,133263)
order by 1;
我猜应该是suma.pur_qty+sumb.selled_qty,因为bal_qtyYou给了我们两个表,但在您的查询中,您指的是两个不同的表。在这种情况下,您不能使用联接,因为它会将所有左侧行聚合到右侧行。尝试不使用sum/group的查询以查看原始数据,您将了解发生了什么:选择a.pur_项目、a.pur_数量、b.SALLED_数量从采购_项目中选择a.pur_项目、a.pur_数量、b.SALLED_数量、a.pur_项目中选择a.pur_项目、a.pur_数量、b.pur_数量、a.pur_项目中选择a.pur_项目、a.pur_项目中选择a.pur_数量;我会全部使用UNION,以防万一。。。计算起来也更容易/更快。亲爱的@GouravGarg如果你发现它是正确的,那么请投票并点击正确的符号接受答案。你能建议我如何每月获得余额吗?例如2014年9月、10月、11月和12月的余额是多少。无关但:请不要依赖于环境相关的隐式数据类型转换。使用“2014年10月8日”将在使用不同日期样式设置的安装中失败。最好的=最健壮和可移植的方法是使用ANSI SQL日期文字:date'2014-10-08'@a_horse_和_no_name我同意你,它可能是不同的日期样式…但这是我在oracle DB中使用的。@GouravGarg是的,您可以通过将日期转换为月份并根据月份对其进行分组,然后使用超前或滞后或行数来添加上一个月的余额,这样您可以计算每个月的余额
Item_Id Bal_qty
12792 28
133263 12
select pur_item, sum(as bal_qty) from (
select pur_item, sum(a.pur_qty) as bal_qty
from purchase_item_qty_amount a
group by 1
union
select pur_item, sum(b.sold_qty)as bal_qty
from sale_item_qty_amount b
group by 1)
group by 1
select a.pur_item, a.pur_qty, b.sold_qty from purchase_item_qty_amount a left join sale_item_qty_amount b on a.pur_item = b.sale_item where a.pur_item IN (12792,133263);
select item, sum(a.pur_qty) + sum(a.sold_qty) as bal_qty from (select pur_item as item, sum(pur_qty) as pur_qty, 0 as sold_qty from purchase_item_qty_amount where pur_item in (12792,133263) group by pur_item union select sale_item as item, 0 as pur_qty, sum(sold_qty) as sold_qty from sale_item_qty_amount where sale_item in (12792,133263) group by sale_item) a group by item;
purchase table
create table pt(Pur_Date date,Item_Id number, Pur_Qty number)
insert into pt values('08.oct.2014',12792,25);
insert into pt values('01.nov.2014',133263,20);
insert into pt values('01.oct.2014',133263,2);
insert into pt values('20.nov.2014',12792,10);
sales table
create table st(Sale_Date date , Item_Id number, Sale_Qty number)
insert into st values('17.nov.2014',133263,-6);
insert into st values('05.nov.2014',12792,-1);
insert into st values('24.nov.2014',133263,-2);
insert into st values('28.oct.2014',12792,-6);
insert into st values('05.nov.2014',133263,-2);
select purchase.Item_Id,(purchase.pur_qty+sale.sale_qty) bal_qty
from
(
select a.Item_Id, sum(a.pur_qty) pur_qty
from pt a
group by a.Item_Id
) purchase
left join
(
select b.Item_Id,
sum(b.sale_qty ) sale_qty
from st b
group by b.Item_Id
) sale
on sale.Item_Id = purchase.Item_Id
where purchase.Item_Id in (12792,133263)
order by 1;