SQL(200分)

  • 主题发起人 主题发起人 flyat
  • 开始时间 开始时间
F

flyat

Unregistered / Unconfirmed
GUEST, unregistred user!
进货表 | 销售表 | 生成如下
| |
商品 数量 | 商品 数量 | 商品 进货量 销售量
A01 2 | A02 1 | A01 3 0
A03 3 | A03 2 | A03 3 2
A02 4 | A02 1 | A02 4 2
A01 1 | | A04 2 0
A04 2 | |

Paradox结构
 
SELECT 进货表.商品,SUM(进货表.数量) AS 进货量,SUM(销售表.数量) as 销售量
from 进货表,销售表 group by 进货表.商品
 
经管Paradox支持中文,但还是建议所有的字段名改为英文或字母,然后照funboy88的写即可。
 
建立文件awfi.sql,内容如下

select 商品,数量,0 as tmp from 进货表
union all
select 商品,数量,1 as tmp from 销售表

再执行
Select 商品,
sum(数量*(1-tmp)) as 进货量,
sum(数量*tmp) as 销售量
From awfi.sql
group by 商品
 
QuickSilver的方法很巧妙!

另一种常用方法:建立文件awfi.sql,内容如下
select 商品,数量 as 进货量,0 as 销售量 from 进货表
union all
select 商品,0 as 进货量,数量 as 销售量 from 销售表

再执行
Select 商品,
sum(进货量) as 进货量,
sum(销售量) as 销售量
From awfi.sql
group by 商品
 
to funboy88: 你的方法好像行不通(在mssql下),不知道你有沒有試過.

這是我的做法:
select a.*,isnull(b.銷售量,0) as 銷售量
from
(select 商品,sum(數量) as 進貨量
from 進貨表
group by 商品) a
left outer join (select 商品,sum(數量) as 銷售量 from 銷售表 group by 商品) b on a.商品=b.商品
 
在ACCESS中调试通过:

SELECT 进货表.商品, Sum(进货表.进货量) AS 进货量之Sum, Sum(销售表.销售量) AS 销售量之Sum
FROM 进货表 LEFT JOIN 销售表 ON 进货表.商品 = 销售表.商品
GROUP BY 进货表.商品

Paradox没用过,不懂。在ACCESS和SQL SERVER中绝对可以。前提是销售表中不能出现进货
表中没有的商品。
 
我喜欢yeskert1的方法,最简单、容易理解,当然也最不容易出错,这样的方法在各种系统
上的兼容性还很好
 
这是一种方法:
SELECT 进货表.商品,SUM(进货表.数量) AS 进货量,SUM(销售表.数量) as 销售量
from 进货表,销售表 group by 进货表.商品 order by 进货表.商品
另一种方法:
Select 商品, 进货量,销售量 from
( select 商品,sum(数量) as 进货量,0 as 销售量 from 进货表 group by 商品
union all
select 商品,0 as 进货量,sum(数量) as 销售量 from 进货表 group by 商品 )
order by 商品
 
[8D][8D]
根据你的需要建立一个“生成表”或“合计表”不是更简单?
结构如下:
  商品 进货量 销售量
使用时运行三条SQL语句:

delete from 合计表

insert into 合计表 select 商品, Sum(进货量) AS 进货量,0 AS 销售量 from 进货表 GROUP BY 商品

update A set A.销售量 = B.销售量 from 合计表 A inner join
(select 商品, Sum(销售量) AS 销售量 from 销售表 GROUP BY 商品) B on A.商品 = B.商品

应该是什么数据库都可以了吧。
其实不一定数据都要用查询来构造的,适当用一些中间表,可以实现很多查询实现不了的功能,解决问题
思路又清晰。
 
QuickSilver的思路独到,如果再加上进货成本和售出均价等,我的脑袋开花;


crazypc :你的第一种方法和funboy88相同,其实是无条件连接两个表(就算再加个Where),然后再分组计算,结果当然出错,不相可试试看;
你的另一种方法的思路和yeskert1相同,换成一条SQL语句,但我测试出错???

miker_fan 和 pyzfl 没试过,只是售出的商品不一定有在进货表,这样又要连接个商品基本信息库。
 
现在考虑用yeskert1还是pyzfl的动作

insert into 合计表
Select 商品,
sum(进货量) as 进货量,
sum(销售量) as 销售量
From awfi.sql
group by 商品
 
select a.商品, a.进货量, b.销售量
from
(select 商品, sum(数量) 进货量 from 进货表 group by 商品)a,
(select 商品, sum(数量) 销售量 from 销售表 group by 商品)b
where a.商品=b.商品
 
select a.商品, a.进货量, b.销售量
from
(select 商品, sum(数量) 进货量 from 进货表 group by 商品)a,
(select 商品, sum(数量) 销售量 from 销售表 group by 商品)b
where a.商品=b.商品
 
[8D][8D]
其实在应用程序中使用中间表和使用变量一样,是一思路,可以自由地实现很多功能,如果
单纯的用SQL语句构造的话,一个是实现起来很辛苦(有些要求根本实现不了),另一个是在
查询互相嵌套时,很消耗资源的(比如有几十万个单据,汇总一下试一试)。

我认为,象目前这个问题其实是个很简单的问题,如果看一下正规的进销存管理软件的话,就
会发现都有“库存表”,也相当于我们的“合计表”,在单据出入时,将库存量的变化 直接
反映到“库存表”中,这样随时都可查询,也不用构造复杂的语句。

象这样的话,就是涉及到建表的技能了。

也话楼主不会给我分,但我一样认为,这么简单一个要求,如果还要在这个功能上“展现”
SQL技艺的话,表明做软件的经验或技巧还是太少了。
 
也许太简单了,完成一个功能不算太难,但追求效率应该是很多人的目标,这个简单的问题
是进销明细的一部分,当然还有很多栏目需统计,只不过最终还是这个简单问题的基础,
所以速度显得很重要,尽管每月或更长时间只一次。
我真的很佩服从能技度看出设计结构和意图,但移动归移动,统计归统计,统计结果当然要放在抽屉里,关于这个我不多说了。
我没有SQL技俩,而且很差劲。
如果觉得就这样好了,我就结吧。
 
我还是感谢pyzfl 有意无意示出数据结构重要性
 
多人接受答案了。
 
后退
顶部