CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

SQL外连接+分组求和

楼主wolfboy(峰鸟)2001-08-21 12:06:29 在 C++ Builder / 基础类 提问

有两个表如下:  
  Item表       //消费信息表  
  Name           //消费字段名称  
  Class         //字段分类  
   
  Card表       //客户消费表  
  Name           //消费字段名称  
  Number       //Name消费的数量  
  Table         //记录表名,在这个例子中应等于"Item"  
   
  现我想把[Item]表中[Class="包厢"]的全部找出,并且如有客户消费,将[Card]表中的[Number]进行求和  
   
  我写了如下语句:  
  Select   Item.Name   Card.Number   From   Item   Left   Jion   Card   Card.Name=Item.Name  
  Where   Item.Class="包厢"  
   
  但有几个问题还没有处理:  
  1、Card.Table="Item"     这句限制语句应放在何处?  
  2、我想对   Card.Number   求和,但不能直接用   Sum(Card.Number)   As   NumberSum  
  否则会出现错误:在Item表中没有可求和的字段Number   (大致意思就是这样的)  
  那应怎样求和呢?  
   
   
   
   
  呵呵,另外顺便问个SQL中的其它问题:  
          对DateTime类型的字段仅截取时间的函数是什么?  
   
  SQL不允许使用自己的函数,但市面有关的资料又少,这不是存心不让人活嘛! 问题点数:40、回复次数:15Top

1 楼luhongjun(过江项羽)回复于 2001-08-21 12:24:21 得分 0

看:http://www.csdn.net/expert/TopicView.asp?id=223026  
  非常清楚。  
  Top

2 楼lluunn007(书生)回复于 2001-08-21 12:31:29 得分 0

up~Top

3 楼wolfboy(峰鸟)回复于 2001-08-21 13:11:14 得分 0

TO   luhongjun(过江项羽)   
  我只想写一个SQL语句,而且我想一个SQL语句就应该行了  
   
  TO   lluunn007(玉笛书生)   
  呵呵,你写的up还带一个~,是不是你的头发飘杨?Top

4 楼wujinbao(abao)回复于 2001-08-21 13:33:50 得分 0

你试一试:  
  Select   A.Name,   SUM(Card.Number)   From   Item   A   LEFT   OUTER   JOIN   Card   B   A.Name=B.Name  
  Where   A.Class="包厢";  
  在C++BUILDER中可以用  
  FormatDateTime("yyyy-m-d",DataSource1->DataSet->FieldByName("Times")->AsDateTime);取时间。FormatDateTime返回一个AnsiString具体看帮助了。Top

5 楼wujinbao(abao)回复于 2001-08-21 13:37:01 得分 0

你试一试:  
  Select   A.Name,   SUM(Card.Number)   From   Item   A   LEFT   OUTER   JOIN   Card   B   A.Name=B.Name  
  Where   A.Class="包厢";  
  在C++BUILDER中可以用  
  FormatDateTime("yyyy-m-d",DataSource1->DataSet->FieldByName("Times")->AsDateTime);取时间。FormatDateTime返回一个AnsiString具体看帮助了。Top

6 楼MountLion(闷头睡)回复于 2001-08-21 13:38:23 得分 2

Select   Item.Name,   Card.Number   From   Item   Left   Join   Card   on   Card.Name=Item.Name  
  Where   Item.Class="包厢"  
    and   Card.Table="Item"    
   
  如果你想同时得到Number的明细与合计,这不是标准SQL办得到的,某些数据库支持,但语法各不相同。  
   
  Top

7 楼wolfboy(峰鸟)回复于 2001-08-21 13:46:25 得分 0

TO   wujinbao(飞扬草)   
  那在Card中有一个限制条件是   Card.Table="Item",这应放在何处呢  
  我放在LEFT   OUTER   JOIN   Card   B   A.Name=B.Name   And   B.Table="Item"  
  出现连接错误  
   
  FormatDateTime这个函数是BCB的,在SQL中不能用的Top

8 楼wolfboy(峰鸟)回复于 2001-08-21 13:48:49 得分 0

TO   MountLion(人不寐)   
  我只要得到Number的合计就行了  
   
  另:将Card.Table="Item"   写在Where中,将得不到任何输出Top

9 楼wujinbao(abao)回复于 2001-08-21 14:02:33 得分 0

哦是么那你试试:  
  Select   A.Name,   SUM(case   when   B.Table="Item"   then   Card.Number   end)   From   Item   A   LEFT   OUTER   JOIN   Card   B   A.Name=B.Name  
  Where   A.Class="包厢";  
   
  在SQL中你用convert(varchar(10),yourdate,20)试试看!  
  Top

10 楼wolfboy(峰鸟)回复于 2001-08-21 14:16:24 得分 0

TO   wujinbao(飞扬草)   
  出现“无法指出的错误”,呵呵,好象BCB的SQL中总是喜欢出现这种错误  
  其实关键是Number在Item表中没有,所能不能合计,看来只好自己另外处理了  
   
  对Convert,出现表达式中函数Convert没定义的错误,我的后台数据库是Access  
  我也曾用过TimeValue,也不行的Top

11 楼wujinbao(abao)回复于 2001-08-21 14:18:27 得分 0

哦你是Access的数据库,我就不清楚了我是在sql下试的。Top

12 楼wujinbao(abao)回复于 2001-08-21 14:24:26 得分 8

是不是该写成  
  Select   A.Name,   SUM(case   when   B.Table="Item"   then   Card.Number   end)   as   消费总数   From   Item   A   LEFT   OUTER   JOIN   Card   B   A.Name=B.Name  
  Where   A.Class="包厢";Top

13 楼wolfboy(峰鸟)回复于 2001-08-21 20:23:03 得分 0

好象不支持   CaseTop

14 楼KingSunSha(弱水三千)回复于 2001-08-21 20:49:51 得分 30

item表:  
  name class  
  ---------------  
  aaaa 包厢  
  bbbb 包厢  
  cccc 包厢  
  dddd xxxx  
  eeee yyyy  
   
  card表:  
  name number table  
  ----------------------------  
  aaaa 100 item  
  aaaa 120 item  
  bbbb 200 item  
  bbbb 80 meti  
  cccc 300 meti  
  dddd 120 item  
   
  sql   statement:  
  ----------------------------------------------------------------  
  select   [item].[name],ttl_number  
      from   [item]   left   join   (select   [name],   sum([number])   as   ttl_number  
                                                    from   card  
                                                  where   [table]   =   "item"  
                                                  group   by   [name])   card_group  
                on   ([item].[name]   =   card_group.[name])  
    where   [class]   =   "包厢"  
  ----------------------------------------------------------------  
   
  结果:  
  name ttl_number  
  ------------------------  
  aaaa 220  
  bbbb 200  
  cccc  
  ------------------------  
   
  请注意:以后不要用table之类来命名一个列或表,或其他的对象,这是sql的保留字。建议先去看看sql入门书。  
  Top

15 楼wolfboy(峰鸟)回复于 2001-08-22 00:27:54 得分 0

懂了,不愧为数据库高手,PFPF  
   
  你推荐几本SQL方面的书吧,我的确在找这类书  
  目前我手上有:  
  <<SQL查询语言及应用>>(Informix数据库培训教材之二)  
  SQL   Server7开发人员指南  
  SQL   Server7.0   管理员参考手册  
   
  但都没有这方面的知识Top

相关问题

  • 求助:在sql中如何分组连接字符串?
  • sql server连接
  • Sql Server连接
  • sql连接
  • SQL的连接
  • asp连接SQL!
  • 连接SQL SERVER
  • asp.net连接sql
  • SQL 分组问题
  • 分组统计SQL?

关键词

  • c++builder
  • 函数
  • sql
  • 语句
  • 字段
  • 数据库
  • 消费
  • 包厢
  • card
  • namewhere

得分解答快速导航

  • 帖主:wolfboy
  • MountLion
  • wujinbao
  • KingSunSha

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

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