`
lovecontry
  • 浏览: 1035855 次
文章分类
社区版块
存档分类
最新评论

[经验总结]做了一个数据库的题

 
阅读更多
有三个表
1. 商品表(商品编号,商品规格,商品条码,商品名称,商品单位)
2.销售主表(销售单ID,销售日期,销售人员编号,销售人员姓名)
3.销售明细表(商品编号,销售人员编号,销售数量,销售日期)

问题:
1.要为每个表建立一个数据模型
2. 写一个SQL语句,在2008.1.1到2008.3.1,每个销售人员销售每件商品的总数。要求结
果中要包括销售人员姓名,商品名称,销售每件商品的总数

看到题目首先明确概念:
主表中的日期是销售清单产生的日期,明细表中的销售日期是单个商品的销售日期。
一张销售清单中可能有多个商品售出。

很久没写SQL语句了,硬着头皮写了个
首先建三个表:
商品表: product(productid#, spec, barcode, name, unit)
销售主表: sale(saleid#, date, staffid, staffname)
销售明细表: detail(productid#,staffid#,num, date)

select s.staffname, p.name, sum(d.num)
from product p, sale s, detail d
where s.staffid = d.staffid and p.productid = d.productid
group by d.productid
having s.date between '2008-1-1' and '2008-3-1'

热心的水木网友licy也写了一个:
select p.name, s.staffname, t.productSum
from product p, sale s,
(select staffid, productid, sum(num) as productSum
from detail
where date between '2008-1-1' and '2008-3-1'
group by staffid,productid) t
where p.productid = t.productid and s.staffid = t.staffid

没考虑左右连接之类的.

认真看过licy写的,我写的错了,错在group by d.productid这行,这里丢了一个d.staffid,不能按销售人员统计商品数量。

再回头看看题目中表设计得挺别扭,原来这里存里两个问题:
1> 销售主表存在传递依赖, 销售单ID-->销售人员编号-->销售人员姓名,应该拆出一个销售人员表。
2>销售主表和销售明细表中都存在一个销售日期字段,冗余。

同时,从这个例子中可以看出关系数据库的局限性,如果要保存每个销售单中的内容是很不方便,因为单子里商品数量不是固定的,而每个销售单建个小表也是不现实的,这样的需求用XML数据库就很合适了。

后记:
今天(09/01/08)看了这篇文章 http://blog.csdn.net/liuzuofei/archive/2009/01/07/3727793.aspx

文章结尾处的有这样的观点:

但是第三范式的弊端在于关联性太多,如是在对于查询时,会造成瓶颈。由此回到前面所说的“第三范式首先应该被抛弃”....

话虽这么说,销售主表不符合第三范式可能带来的问题就是,无法对销售人员数据进行添加和删除,而且销售人员姓名数据冗余。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics