如何写这样的sql语句

数据库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),不是单价。

你所考虑的问题不是查询价格时需要考虑的。而是在向数据库插入数据时业务逻辑层需要考虑的。

跟你举个例子说说,

现在开始

向数据库中添加“1寸片”5张、总价格为1000元。那么从树的叶子节点往上,分别为“小图”-->“出图”,最后到树根吧,这个过程中,“小图”也在数量上加5张,价格上加1000;“出图”也在数量上加5张,价格上加1000。

再向数据库中添加“打印片”也是5张、总价格为也是1000元。那么从树的叶子节点往上,分别为“大图”-->“出图”,最后到树根吧,这个过程中,“大图”也在数量上加5张,价格上加1000;“出图”在数量上再加5张,价格上再加1000。

两次插入之后,现在用我给你sql语句查询:
查出来的结果是:
服务项目 数目 总价

出图 10 2000
大图 5 1000
小图 5 1000
1寸片 5 1000
打印片 5 1000

满足等你给出的等式:出图=小片+大片=1寸片+2寸片+3寸片+打印片+激光片。

其实你要实现的逻辑比较复杂,可以在程序里实现,否则,万一将来需求有更改,再来维护这个sql几乎是不可能的事情。

一般比较麻烦的就写个存储过程吧,多看联机帮助,另外你去下载一个“SQLServer2000常用函数大全及个人收藏”,绝对有你意想不到的惊喜