现在我需要做一个一级类别的统计,涉及三张表,一张是订单表 Oder,一张是商品信息表 Item,最后一张是商品类型表 TypeType表里面的类别分了好多级,只有一个level字段来识别,现在统计变得非常麻烦。想用LIKE来做,发现不会....请大家帮帮我,在考虑性能的前提下,应该怎样写?我要统计level类的订单数量,类似于
订单数 物品类别
1258 硬件
1225 软件
8585 玩具
涉及的三张表如下:Order---订单表
OrderId ItemId
1 8
2 9 Item----物品表
ItemId ItemType
8 0223
9 033333Type----物品类型表
TypeNo Level TypeName
02 1 软件
022 2 应用软件
0223 3 everse
03 1 硬件
033333 5 内存
订单数 物品类别
1258 硬件
1225 软件
8585 玩具
涉及的三张表如下:Order---订单表
OrderId ItemId
1 8
2 9 Item----物品表
ItemId ItemType
8 0223
9 033333Type----物品类型表
TypeNo Level TypeName
02 1 软件
022 2 应用软件
0223 3 everse
03 1 硬件
033333 5 内存
select c.typename as 物品类别,count(OrderId) as 订单数
from Order a,Item b,Type c
where a.ItemId = b.ItemId and b.ItemType = c.TypeNo
group by c.typename
select c.typename as 物品类别,count(OrderId) as 订单数
from Order a,Item b,Type c
where a.ItemId = b.ItemId and b.ItemType = c.TypeNo and c.Level = 1
group by c.typename
少打了个a.
你这个只统计了level 1 的个数,没有把它下级的个数也统计进去,我需要把属于它下级的个数也统计
标题:SQL SERVER 2000中查询指定节点及其所有子节点的函数(表格形式显示)
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-05-12
地点:广东深圳
*/create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
insert into tb values('001' , null , '广东省')
insert into tb values('002' , '001' , '广州市')
insert into tb values('003' , '001' , '深圳市')
insert into tb values('004' , '002' , '天河区')
insert into tb values('005' , '003' , '罗湖区')
insert into tb values('006' , '003' , '福田区')
insert into tb values('007' , '003' , '宝安区')
insert into tb values('008' , '007' , '西乡镇')
insert into tb values('009' , '007' , '龙华镇')
insert into tb values('010' , '007' , '松岗镇')
go--查询指定节点及其所有子节点的函数
create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int)
as
begin
declare @level int
set @level = 1
insert into @t_level select @id , @level
while @@ROWCOUNT > 0
begin
set @level = @level + 1
insert into @t_level select a.id , @level
from tb a , @t_Level b
where a.pid = b.id and b.level = @level - 1
end
return
end
go--调用函数查询001(广东省)及其所有子节点
select a.* from tb a , f_cid('001') b where a.id = b.id order by a.id
/*
id pid name
---- ---- ----------
001 NULL 广东省
002 001 广州市
003 001 深圳市
004 002 天河区
005 003 罗湖区
006 003 福田区
007 003 宝安区
008 007 西乡镇
009 007 龙华镇
010 007 松岗镇(所影响的行数为 10 行)
*/--调用函数查询002(广州市)及其所有子节点
select a.* from tb a , f_cid('002') b where a.id = b.id order by a.id
/*
id pid name
---- ---- ----------
002 001 广州市
004 002 天河区(所影响的行数为 2 行)
*/--调用函数查询003(深圳市)及其所有子节点
select a.* from tb a , f_cid('003') b where a.id = b.id order by a.id
/*
id pid name
---- ---- ----------
003 001 深圳市
005 003 罗湖区
006 003 福田区
007 003 宝安区
008 007 西乡镇
009 007 龙华镇
010 007 松岗镇(所影响的行数为 7 行)
*/drop table tb
drop function f_cid
我的类别表没有pid这个字段,只有Level........所以非常麻烦啊
create table t1
(
orderid int,
itemid int
)
insert into t1
select 1, 8 union all
select 2, 9 union all
select 3,10
create table t2
(
itemid int,
itemtype varchar(10)
)
insert into t2
select 8, '0223' union all
select 9, '033333' union all
select 10,'022'
create table t3
(
typeno varchar(10),
lv int,
typename varchar(50)
)
insert into t3
select '02', 1, '软件' union all
select '022', 2, '应用软件' union all
select '0223', 3, 'everse' union all
select '03', 1, '硬件' union all
select '033333', 5, '内存'select d.amount,t3.typename from t3 inner join
(select count(a.orderid) as amount,left(b.itemtype,2) as typeno from t1 a inner join t2 b on a.itemid=b.itemid
inner join t3 c on b.itemtype=c.typeno group by left(b.itemtype,2)) d on t3.typeno=d.typeno