SQL外连接+分组求和
有两个表如下:
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




