200大元求一个SQL查询
商品类别编码表为:
+++++++++++++++++++++++++++++++++++++++++++
商品类别编码 商品名称 上级编码 序号
00 全部商品 1
0001 服装 00 2
0002 文具 00 3
000101 儿童服装 0001 4
00010101 女童装 000101 5
00010102 男童装 000101 6
000102 成人服装 0001 7
.....
++++++++++++++++++++++++++++++++++++++++++++
其中编码的排列如同:
00-00-00-00-00 各个占两位,允许8级编码
+++++++++++++++++++++++++++++++++++++++++++++
商品的库存和编码表:
商品唯一ID码 商品名称 商品类别编码 库存金额
000A 霓裳牌11号女装 000102 5000
000B 米老鼠9号女童装 00010101 600
000C 米老鼠婴儿服装 000101 6000
......
+++++++++++++++++++++++++++++++++++++++++++++++++
现在想出这样的报表:
商品类别 库存金额
00 商品 : 为所有的商品金额的合计
0001 服装: 为所有的前4位编码类于‘0001’,(包括‘0001’)金额的合计
000101 童装
....
000102 女装
....
0002 文具: 为所有的前4位编码类于‘0002’,(包括‘0002’)金额的合计
在下一级的金额总合计要等于上一级的金额数, 但问题难点在于比如上表的服装和文具合计数不一定和‘商品’的金额数相等,因为可能会有用户只输入了物品的类别为“商品”,如果有这样的情况,如何得到这样的列表
00 商品 : 为所有的商品金额的合计
0001 服装: 为所有的前4位编码类于‘0001’,(包括‘0001’)金额的合计
0002 文具: 为所有的前4位编码类于‘0002’,(包括‘0002’)金额的合计
00 商品: 为用户只输入了00为类别的商品 ,金额合计
.....
其它各个级别与此类似,有没有可能只SQL语句实现?
问题点数:200、回复次数:37Top
1 楼FrameSniper(http://naoku.net/blogs/framesniper/)回复于 2003-08-03 01:02:53 得分 0
No one can solve this problem????????????????Top
2 楼pengdali()回复于 2003-08-03 02:07:49 得分 100
create table #商品类别编码表(商品类别编码 varchar(100),商品名称 varchar(100),上级编码 varchar(100),序号 int)
insert #商品类别编码表 values('00', '全部商品', null, 1 )
insert #商品类别编码表 values('0001', '服装' ,'00' , 2 )
insert #商品类别编码表 values('0002' , '文具' ,'00' , 3 )
insert #商品类别编码表 values('000101', '儿童服装' , '0001' , 4 )
insert #商品类别编码表 values('00010101', '女童装' ,'000101' , 5)
insert #商品类别编码表 values('00010102' , '男童装' ,'000101' , 6)
insert #商品类别编码表 values('000102' , '成人服装', '0001' ,7)
create table #商品的库存和编码表(商品唯一ID码 char(4),商品名称 varchar(100),商品类别编码 varchar(100),库存金额 money)
insert #商品的库存和编码表 values('000A','霓裳牌11号女装', '000102' , 5000)
insert #商品的库存和编码表 values('000B','米老鼠9号女童装', '00010101' , 600)
insert #商品的库存和编码表 values('000C','米老鼠婴儿服装', '000101' , 6000)
--1、
select *,(select isnull(sum(库存金额),0) from #商品的库存和编码表 where 商品类别编码 like #商品类别编码表.商品类别编码+'%') from #商品类别编码表 order by 商品类别编码
--2、
select SPACE(len(商品类别编码))+商品类别编码 商品类别编码,商品名称,(select isnull(sum(库存金额),0) from #商品的库存和编码表 where 商品类别编码 like #商品类别编码表.商品类别编码+'%') 合计,商品类别编码 from #商品类别编码表 order by 商品类别编码
--3、
declare @参数 varchar(100)
set @参数='00'
select SPACE(len(商品类别编码))+商品类别编码 商品类别编码,商品名称,(select isnull(sum(库存金额),0) from #商品的库存和编码表 where 商品类别编码 like #商品类别编码表.商品类别编码+'%') 合计,商品类别编码 from #商品类别编码表 where (@参数 like 商品类别编码+'%' or 商品类别编码 like @参数+'%') and len(商品类别编码)<=len(@参数)+2 order by 商品类别编码
set @参数='0001'
select SPACE(len(商品类别编码))+商品类别编码 商品类别编码,商品名称,(select isnull(sum(库存金额),0) from #商品的库存和编码表 where 商品类别编码 like #商品类别编码表.商品类别编码+'%') 合计,商品类别编码 from #商品类别编码表 where (@参数 like 商品类别编码+'%' or 商品类别编码 like @参数+'%') and len(商品类别编码)<=len(@参数)+2 order by 商品类别编码
go
drop table #商品的库存和编码表,#商品类别编码表Top
3 楼cgh1970(聊天别找我)回复于 2003-08-03 05:17:22 得分 0
关注Top
4 楼yesxwl(吴宫幽径)回复于 2003-08-03 08:36:36 得分 0
只能眼瞅瞅,学习Top
5 楼forgot2000(忘记2000年)回复于 2003-08-03 08:40:14 得分 50
select 商品类别编码,商品名称,Sum(库存金额) from
(select a.商品类别编码,a.商品名称,b.库存金额 from 商品类别编码表 a,商品的库存和编码表 b
where left(b.商品类别编码,len(a.商品类别编码))=a.商品类别编码) c
group by 商品类别编码,商品名称
order by len(商品类别编码),商品类别编码Top
6 楼cctvnet(大虫)回复于 2003-08-03 08:46:39 得分 0
来看看四星级的Top
7 楼lxl(是我,不是风)回复于 2003-08-03 11:53:19 得分 0
呵呵 对大力惊为天人矣
但是还是如题所提到的问题,大力提供的查询结果如下表,其中女童装+男童装金额=600
儿童服装金额却为6600,还是体现不了上下金额相同的情况
00 全部商品 11600.0000 00
0001 服装 11600.0000 0001
000101 儿童服装 6600.0000 000101
00010101 女童装 600.0000 00010101
00010102 男童装 .0000 00010102
Top
8 楼FrameSniper(http://naoku.net/blogs/framesniper/)回复于 2003-08-03 12:14:33 得分 0
哈!SQL版的老大寂寞难耐跑到Delphi版来发泄?呵呵.......Top
9 楼qianguob(不懂编程)回复于 2003-08-03 12:32:32 得分 30
select 商品类别编码,商品名称,Sum(库存金额) from
(select a.商品类别编码,a.商品名称,b.库存金额 from 商品类别编码表 a,商品的库存和编码表 b
where left(b.商品类别编码,len(a.商品类别编码))=a.商品类别编码) c
group by 商品类别编码,商品名称
order by len(商品类别编码),商品类别编码
这样应该可以了,但是你如果要让000101 的和 等于 00010101 ,00010102...的和
这肯定是你的数据有问题, 因为,000101的库存金额是用它的下一级SUM 出来的啊。
不知道你想要得到什么结果了。Top
10 楼lxl(是我,不是风)回复于 2003-08-03 13:16:44 得分 0
不一定数据有问题吧,
在实际操作时候会有这种情况,
原来的商品分类用户觉得已经够用了
比如说只用到0001一级,
这样的话他的部分商品就会只设置到这一级,
但是以后随着使用过程的发现,
他们又在这个级别下增加了000101这一个级别
这样的话
只要有一部分商品还停在0001的类别上
就会出现下一级别的总和加起来不等于上一级的情况呀Top
11 楼qianguob(不懂编程)回复于 2003-08-03 13:40:13 得分 0
那你手工统计是怎样的结果啊?
也应该是不相等的啊。Top
12 楼lxl(是我,不是风)回复于 2003-08-03 13:43:08 得分 0
我是想得到这样的列表:
0001类 总金额
其中000101 金额
000102 金额
0001(类别为‘0001’) 的金额
Top
13 楼TechnoFantasy((VB MVP)www.applevb.com)回复于 2003-08-03 13:44:33 得分 20
这个是数据库处理树形的问题。原来我们的解决方法是:
创建一个节点与上级节点的关系表,三个字段:节点ID,上级节点ID,上级节点与本节点的距离。
针对没一个节点,要讲其与所有上级节点直到根节点的关系都列在表中。
例如上面中的记录
000102 成人服装 0001 7
在这个表中会生成两条记录:
节点ID 上级节点ID 上级节点与本节点的距离
000102 0001 1
000102 00 2
这样解决问题就简单多了。
Top
14 楼qianguob(不懂编程)回复于 2003-08-03 13:56:29 得分 0
正如楼上所说的。
这样不太好实现了
其实你就是又多增加了条记录。
但是又不能找出规律来,我再看看,不过很难的啊。Top
15 楼pengdali()回复于 2003-08-03 14:46:22 得分 0
你要得到什么,请列出目标结果集Top
16 楼lxl(是我,不是风)回复于 2003-08-03 15:34:00 得分 0
呵呵,想得到这样的列表:
上级分类代码 上级分类代码总金额
0001 6600.00
次级分类的各个金额(这个大力已经实现),再加上仅把商品类别分到了‘0001’,
既是上一级代码的金额
类如:
000101 金额1
000102 金额2
0001(某些商品只定义了类别为‘0001’) 金额
Top
17 楼pengdali()回复于 2003-08-03 17:10:06 得分 0
--4、
declare @参数 varchar(100)
set @参数='0001'
select 商品类别编码,商品名称,(select isnull(sum(库存金额),0) from #商品的库存和编码表 where 商品类别编码 like #商品类别编码表.商品类别编码+'%') 合计 from #商品类别编码表 where 商品类别编码 like @参数+'%' and len(商品类别编码)<=len(@参数)+2 order by 商品类别编码
--5、
set @参数='0001'
select 商品类别编码,商品名称,(select isnull(sum(库存金额),0) from #商品的库存和编码表 where 商品类别编码 like #商品类别编码表.商品类别编码+'%') 合计 from #商品类别编码表 where 商品类别编码 like @参数+'%' and len(商品类别编码)=len(@参数)+2 -- order by 商品类别编码
union all
select 商品类别编码,商品名称,(select isnull(sum(库存金额),0) from #商品的库存和编码表 where left(商品类别编码,len(@参数))=@参数) 合计 from #商品类别编码表 where 商品类别编码=@参数
Top
18 楼IUPRG(给我点一首周截棍的“双杰伦”)回复于 2003-08-03 18:10:42 得分 0
先保留着,回头参考参考... ...Top
19 楼qianguob(不懂编程)回复于 2003-08-03 20:22:39 得分 0
看来已经解决了。
大力真的很厉害啊。Top
20 楼root3646(游牧人(虫子))回复于 2003-08-03 22:15:16 得分 0
看看~Top
21 楼root3646(游牧人(虫子))回复于 2003-08-03 22:34:33 得分 0
lxl (蚊蚊)
你是上海的吗?Top
22 楼forgot2000(忘记2000年)回复于 2003-08-04 09:56:23 得分 0
搞那么复杂干嘛呢?!如果你用的是SQLServer2000,我给的答案绝对不会有问题(只要你的需求分析是正确的话)。
Top
23 楼ashes(灰尘)回复于 2003-08-04 10:00:32 得分 0
gzTop
24 楼ltmb118()回复于 2003-08-04 12:14:24 得分 0
rollupTop
25 楼fhuibo(永远深爱一个叫“莎”的好女孩儿)回复于 2003-08-04 12:37:09 得分 0
studyTop
26 楼risingsoft(一苇渡江)回复于 2003-08-04 12:46:01 得分 0
select a.商品类别编码,sum(b.库存金额) from 商品类别编码表 a,商品的库存和编码表 b
where a.商品类别编码=b.商品类别编码
group by a.商品类别编码
order by 商品类别编码Top
27 楼zhuking(【0莫须有0】)回复于 2003-08-04 12:53:37 得分 0
瞪眼瞧瞧,回去睡觉!Top
28 楼dickeybird888(小鸟)回复于 2003-08-04 12:55:24 得分 0
你可以用dxgrid来实现这样的功能,在连接对应的打印控件就可以了,ok
Top
29 楼blueWay11(蔚蓝)回复于 2003-08-04 13:02:23 得分 0
uuTop
30 楼happyliyilei(莞风)回复于 2003-08-04 13:13:45 得分 0
OKTop
31 楼zhoutian618(秦失其鹿,天下共逐,唯胜者得鹿而割之)回复于 2003-08-04 13:39:05 得分 0
这个很好解决啊。
一星级了,这么高,真是厉害。
居然还有传说中的四级!
都很不起,
本来知道答案,还是不说的好,免得。。。Top
32 楼hnhb(不死鸟)回复于 2003-08-04 23:04:36 得分 0
瞧瞧Top
33 楼guolinchao(kony)回复于 2003-08-04 23:44:44 得分 0
大力真的很厉害,也很热心!我也得到过他的帮助,再次感谢他!Top
34 楼lxl(是我,不是风)回复于 2003-08-05 12:32:43 得分 0
这个问题的实现,正如不少热心朋友给出的用个GROUP BY 就可以解决了的,
但是在直接出报表时就要对格式,排列位置顺序等作一番考虑和调整了,
而且如题所说的统计难点是在于上级分类中会含的同级分类的商品
大力给出的SQL妙就妙在仅用SQSL就可以灵活控制要统计的类别级别(如只统计00-00级的,
就用不着把00-00-00-00等下级的全部列出),而且不用任何设置就可以直接从DBGRID
中就清楚看到各级类别的金额组成。
TO 虫子:呵呵,我在贵州
TO 周天:我是一星级不过是因为上CSDN的时间长了点,水平倒不见得怎么样,对大力的回复衷心佩服,对这个问题看来您“山人自有妙计”,虚心求教,能贴出来让我学习学习吗?
再次真心感谢大家的热心参与。Top
35 楼geyobing(大地精灵)回复于 2003-08-05 13:35:54 得分 0
学习Top
36 楼zhoutian618(秦失其鹿,天下共逐,唯胜者得鹿而割之)回复于 2003-08-07 13:01:02 得分 0
兄弟,不好意思。
我实在没有太多的时间来帮你,
如果我做,也要比大力的差多了,
大力可是四星级哦。佩服ing.
我自己的设计文档都还没有写完,
烦恼ing.Top
37 楼hyj122(hyj122)回复于 2003-08-07 13:49:34 得分 0
哇!!!!!UP-----你说的是什么意思呢Top




