CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  数据库相关

200大元求一个SQL查询

楼主lxl(是我,不是风)2003-08-03 00:28:05 在 Delphi / 数据库相关 提问

商品类别编码表为:  
  +++++++++++++++++++++++++++++++++++++++++++  
  商品类别编码     商品名称     上级编码     序号  
  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

相关问题

  • sql查询
  • SQL SERVER 查询
  • sql查询??
  • sql 查询
  • sql查询
  • SQL查询
  • sql 查询
  • sql查询(select)
  • SQL查询
  • SQL查询

关键词

  • 编码
  • 商品
  • 金额
  • 类别
  • 童装
  • 合计
  • 库存
  • 服装
  • 文具
  • 米老鼠

得分解答快速导航

  • 帖主:lxl
  • pengdali
  • forgot2000
  • qianguob
  • TechnoFantasy

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo