Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql左联接提供重复的多个值_Sql_Postgresql_Left Join - Fatal编程技术网

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

朋友们,我无法取得正确的结果,请建议,提前感谢。 我有两张桌子,试图平衡数量

一个是采购表采购详情

二是销售表销售明细表

使用左连接后 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_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;