实在搞不明白差异在哪里?

ggsysy 2009-06-19 08:39:34
create view a
as
select isnull(xs.分店名称,th.分店名称) 分店名称,
isnull(xs.货品代码,th.货品代码) 货品代码,
isnull(xs.货品名称,th.货品名称) 货品名称,
isnull(xs.单位,th.单位) 单位,
sum(isnull(xs.数量,0)) 销售数量,
sum(isnull(th.数量,0)) 退货数量,
sum(isnull(xs.数量,0))-sum(isnull(th.数量,0)) 销退差量
from 销售 xs full join 退货 th on xs.分店名称=th.分店名称 and xs.货品代码=th.货品代码 and xs.单位=th.单位 and xs.货品名称=th.货品名称
group by isnull(xs.分店名称,th.分店名称),isnull(xs.货品代码,th.货品代码),isnull(xs.单位,th.单位),isnull(xs.货品名称,th.货品名称)


create view aa
as
select isnull(xs.分店名称,th.分店名称) 分店名称,
isnull(xs.货品代码,th.货品代码) 货品代码,
isnull(xs.货品名称,th.货品名称) 货品名称,
isnull(xs.单位,th.单位) 单位,
isnull(xs.数量,0) 销售数量,
isnull(th.数量,0) 退货数量,
isnull(xs.数量,0)-isnull(th.数量,0) 销退差量
from (select 分店名称,货品代码,货品名称,sum(数量) 数量,单位 from 销售 group by 分店名称,货品代码,货品名称,单位) xs
full join
(select 分店名称,货品代码,货品名称,sum(数量) 数量,单位 from 退货 group by 分店名称,货品代码,货品名称,单位) th
on xs.分店名称=th.分店名称 and xs.货品代码=th.货品代码 and xs.单位=th.单位 and xs.货品名称=th.货品名称

然后验算销售总量和退货总量:
1、select sum(销售数量),sum(退货数量) from a
2、select sum(销售数量),sum(退货数量) from aa

发现1的销售和退货的总数量都是偏大,2的销售和退货的总数量就是对的,我就不明白,一个是先求差再分组,一个是先分组再求差,按道理是一样的,可是结果却不一样,错在哪里?
...全文
54 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ai_li7758521 2009-06-20
  • 打赏
  • 举报
回复
1.销售 xs full join 退货 产生了多余记录
幸运的意外 2009-06-20
  • 打赏
  • 举报
回复
关键是group by isnull(xs.分店名称,th.分店名称),isnull(xs.货品代码,th.货品代码),isnull(xs.单位,th.单位),isnull(xs.货品名称,th.货品名称)
这句话。分组时会根据full join后的内部表来按照分组条件进行分组,这样有可能发生分组信息不确定的情况,所以造成数据有误差。
  • 打赏
  • 举报
回复
full join 造成了数据量加大,sum的时候,数据就会增大。

booksoon 2009-06-20
  • 打赏
  • 举报
回复
full join 退货 th on
full join (select 分店名称,货品代码,货品名称,sum(数量) 数量,单位 from 退货 group by 分店名称,货品代码,货品名称,单位) th on "
claro 2009-06-20
  • 打赏
  • 举报
回复
帮顶。
ks_reny 2009-06-19
  • 打赏
  • 举报
回复

select *
from 销售 xs full join 退货 th on xs.分店名称=th.分店名称 and xs.货品代码=th.货品代码 and xs.单位=th.单位 and xs.货品名称=th.货品名称

楼主先执行以下上面的代码是不是会有重复的记录?
--小F-- 2009-06-19
  • 打赏
  • 举报
回复
--注意第一个是"full join 退货 th on "
第二个是"full join
(select 分店名称,货品代码,货品名称,sum(数量) 数量,单位 from 退货 group by 分店名称,货品代码,货品名称,单位) th
on "
JonasFeng 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 guangguang2007 的帖子:]
SQL codecreate view a
as
select isnull(xs.分店名称,th.分店名称) 分店名称,
isnull(xs.货品代码,th.货品代码) 货品代码,
isnull(xs.货品名称,th.货品名称) 货品名称,
isnull(xs.单位,th.单位) 单位,
sum(isnull(xs.数量,0)) 销售数量,
sum(isnull(th.数量,0)) 退货数量,
sum(isnull(xs.数量,0))-sum(isnull(th.数量,0)) 销退差量
from 销售 xs full join 退货 th on xs.分店名称=th.分店名称…
[/Quote]

这两个语句完全不同。
第一句FULL JOIN 退货

第二句FULL JOIN
select 分店名称,货品代码,货品名称,sum(数量) 数量,单位 from 退货 group by 分店名称,货品代码,货品名称,单位

这就是区别

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧