数据库MS SQLSERVER2000
3个表:sort,service,sales 表结构如下:
Sort(服务项目大类表):
CREATE TABLE [dbo].[Sort] (
[SortID] [int] IDENTITY (1, 1) NOT NULL ,
[SortName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[ParentID] [int] NOT NULL ,
[ParentName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[code] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
Service(具体的服务项目表):
CREATE TABLE [dbo].[Service] (
[ServiceID] [int] IDENTITY (1, 1) NOT NULL ,
[SortID] [int] NOT NULL ,
[ServiceName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL
) ON [PRIMARY]
TABLE [dbo].[Sales] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[ServiceID] [int] NOT NULL ,
[Amount] [int] NOT NULL ,
[Total] [money] NOT NULL
) ON [PRIMARY]
问题:统计所有大类的销售额。
最终界面显示类似:
服务项目 数量 销售合计
-------------------------
出图 42344 79337.73
小片 33972 16091.25
大片 8372 33246.48
1寸片 38 27.35
2寸片 8 8.75
打印片 244 637.01
附:
Sort中表的记录类似:
sortID sortName parentID parentName code
------------------------------------------------------
26 出图 -1 服务项目 101
27 小片 26 出图 101101
28 大片 26 出图 101102
29 打印片 28 大片 101102101
119 1寸片 27 小片 101101101
120 2寸片 27 小片 101101102
Service表中的数据类似:
serviceID sortID serviceName
---------------------------------------
439 119 1寸片
444 124 7寸片
445 120 2寸片
446 121 3寸片
SQL语句不会写。
如果统计所有的节点的销售记录,就添加第零步。
0.取出所有的sortId,并将其作为第1步的sortId的参数
比如要统计出图的,(一开始把出图的叶子节点和树枝节点找出来。
然后再从中找出出图的叶子节点最后统计找出叶子节点的销售总额
)
1.根据出图的ID查到出图的code,
[code="java"]select code from sort where sortId=26[/code]
2.select 所有的code
[code="java"] select code from sort[/code]
3.在所有的code中取出以出图的code开头的code(这一步去取出了所有的树枝节点和叶子节点,
都是出图的)
[code="java"]seelct code from sort where code like '101%'[/code]
4.用第三步的code取出对应的sortId
[code="java"]select sortId from sort where code =第三步取出的code[/code]
5.然后第四步取出的sortId跟Service这张表做left join,或者union,并取出serviceId就行(这时候是不是出图所有的叶子节点的ServiceID了。
)。
[code="java"]select * from sort as sort,service as s where sort.sortId+=s.sortId[/code]
6.根据第五步取出的serviceid,在sales表中统计数据(这步要用到group by了)。
[code="java"]select s.serviceId from sort as sort,service as s where sort.sortId+=s.sortId and s.sortId=第四步的sortId[/code]
select parentName, Amount, Total
from Sort, Service, Sales
where Sort.sortID = Service.sortID and Sales.ServiceID=Service.ServiceID
这样看行不行。
[code="sql"]SELECT Sales.Total, Sales.Amount, Sort.SortName
FROM Sales INNER JOIN
Service ON Sales.ServiceID = Service.ServiceID INNER JOIN
Sort ON Service.SortID = Sort.SortID[/code]
补充:上面的sql语句我已测试通过。
我理解你考虑的问题。
请仔细看数据库设计的说明:
[quote] [Total] [money] NOT NULL [/quote]
这个money是总价(Total),不是单价。
你所考虑的问题不是查询价格时需要考虑的。而是在向数据库插入数据时业务逻辑层需要考虑的。
跟你举个例子说说,
两次插入之后,现在用我给你sql语句查询:
查出来的结果是:
服务项目 数目 总价
出图 10 2000
大图 5 1000
小图 5 1000
1寸片 5 1000
打印片 5 1000
满足等你给出的等式:出图=小片+大片=1寸片+2寸片+3寸片+打印片+激光片。
其实你要实现的逻辑比较复杂,可以在程序里实现,否则,万一将来需求有更改,再来维护这个sql几乎是不可能的事情。
一般比较麻烦的就写个存储过程吧,多看联机帮助,另外你去下载一个“SQLServer2000常用函数大全及个人收藏”,绝对有你意想不到的惊喜