基本表:xf_vip(会员信息) , XF_BONUSLEDGER (积分信息)
两表唯一相同列为 XF_VIPCODE(卡号,又叫会员号)筛选条件
卡号: 至
性别: 男或女或不限
会员等级: XF_GRADE
消费时间段:XF_BONUSLEDGER.XF_TXDATE
出生日期:XF_DOB
办卡日期:XF_JOINTDATE
消费金额:XF_BONUSLEDGER .XF_AMOUNT
积分排名:
积分区间内:
排序 按会员号题目:依照样例按要求查询出每人的基本信息与积分状况
所求结果样例:解释:xf_vip表每人只有一条记录,XF_BONUSLEDGER表每人有多条记录。结果样例中最后三列为XF_BONUSLEDGER表字段采用sum,前面的全为xf_vip表字段。积分有正有负,当前积分为按人分组把所有积分加起来,历史积分为只把正数的积分加起来。现在我只是试验,只用卡号作为筛选,其它条件暂不做,所写sql语句如下:select a.xf_vipcode,xf_surname,xf_telephone,xf_address1,xf_sex,
xf_dob,xf_jointdate,
SUM(a.xf_bonus) AS 当前积分 ,
SUM(a.xf_amount) AS 购买金额 ,
SUM(t.xf_bonus) AS 历史积分
FROM XF_VIP,XF_BONUSLEDGER a,XF_BONUSLEDGER t
WHERE (a.xf_vipcode BETWEEN '000000004' AND '600010651')
AND t.xf_vipcode = a.xf_vipcode
AND (a.xf_vipcode = xf_vip.xf_vipcode)
AND t.xf_bonus>0
GROUP BY a.xf_vipcode,xf_surname,xf_telephone,xf_address1,xf_sex,
xf_dob,xf_jointdate
ORDER BY a.xf_vipcode ;
执行后能有结果,但经过人工对基本表中的数据进行采样验证,发现所得积分结果比实际大很多,其中有些 当前积分 与 历史积分 是一样的;购买金额没验证,估计也是同样的错误。求大神解救附图:基本表字段信息
xf_vip:
XF_BONUSLEDGER:
两表唯一相同列为 XF_VIPCODE(卡号,又叫会员号)筛选条件
卡号: 至
性别: 男或女或不限
会员等级: XF_GRADE
消费时间段:XF_BONUSLEDGER.XF_TXDATE
出生日期:XF_DOB
办卡日期:XF_JOINTDATE
消费金额:XF_BONUSLEDGER .XF_AMOUNT
积分排名:
积分区间内:
排序 按会员号题目:依照样例按要求查询出每人的基本信息与积分状况
所求结果样例:解释:xf_vip表每人只有一条记录,XF_BONUSLEDGER表每人有多条记录。结果样例中最后三列为XF_BONUSLEDGER表字段采用sum,前面的全为xf_vip表字段。积分有正有负,当前积分为按人分组把所有积分加起来,历史积分为只把正数的积分加起来。现在我只是试验,只用卡号作为筛选,其它条件暂不做,所写sql语句如下:select a.xf_vipcode,xf_surname,xf_telephone,xf_address1,xf_sex,
xf_dob,xf_jointdate,
SUM(a.xf_bonus) AS 当前积分 ,
SUM(a.xf_amount) AS 购买金额 ,
SUM(t.xf_bonus) AS 历史积分
FROM XF_VIP,XF_BONUSLEDGER a,XF_BONUSLEDGER t
WHERE (a.xf_vipcode BETWEEN '000000004' AND '600010651')
AND t.xf_vipcode = a.xf_vipcode
AND (a.xf_vipcode = xf_vip.xf_vipcode)
AND t.xf_bonus>0
GROUP BY a.xf_vipcode,xf_surname,xf_telephone,xf_address1,xf_sex,
xf_dob,xf_jointdate
ORDER BY a.xf_vipcode ;
执行后能有结果,但经过人工对基本表中的数据进行采样验证,发现所得积分结果比实际大很多,其中有些 当前积分 与 历史积分 是一样的;购买金额没验证,估计也是同样的错误。求大神解救附图:基本表字段信息
xf_vip:
XF_BONUSLEDGER:
解决方案 »
- 想做Oracle设计和开发
- Proc中打开游标:ORA-01722
- 一个关于条件判断的问题,在线等
- 第一次安装学习oracle 9i (9.2.0.1.0) 并还原了一备份数据库 但不知道在那个菜单下可以找到表?
- oracle如何查询某个时间段的语句
- 欢迎大家给我推荐oracle的好书,谢谢先
- 请教一下sql语句中?(问号)的意思和用法?
- 达人帮看一下,导入导出SQL
- 视图的效率和动态SQL得比较??希望得到各位的解答,参与有分!!!
- Linux下OCI编程请教。
- 子查询与trunc()函数
- shutdown immediate时ORA-01507: ?????? startup时ORA-00205: ?????????, ??????, ????
xf_surname,
xf_telephone,
xf_address1,
xf_sex,
xf_dob,
xf_jointdate,
SUM(a.xf_bonus) AS 当前积分,
SUM(a.xf_amount) AS 购买金额,
SUM(case
when a.xf_bonus > 0 then
a.xf_bonus
else
o
end) AS 历史积分
FROM XF_VIP, XF_BONUSLEDGER a
WHERE a.xf_vipcode BETWEEN '000000004' AND '600010651'
AND a.xf_vipcode = xf_vip.xf_vipcode
GROUP BY a.xf_vipcode,
xf_surname,
xf_telephone,
xf_address1,
xf_sex,
xf_dob,
xf_jointdate
ORDER BY a.xf_vipcode;
when a.xf_bonus > 0 then
a.xf_bonus
else
o
end) AS 历史积分
FROM XF_VIP, XF_BONUSLEDGER a
WHERE a.xf_vipcode BETWEEN '000000004' AND '600010651'
AND a.xf_vipcode = xf_vip.xf_vipcode
GROUP BY a.xf_vipcode,
xf_surname,
xf_telephone,
xf_address1,
xf_sex,
xf_dob,
xf_jointdate
ORDER BY a.xf_vipcode;
请问 sql语言中 case什么意思?我学过的其它语言case是跟switch一起出现的。
FROM XF_VIP, XF_BONUSLEDGER a
WHERE a.xf_vipcode BETWEEN '000000004' AND '600010651'
AND a.xf_vipcode = xf_vip.xf_vipcode
GROUP BY a.xf_vipcode,
xf_surname,
xf_telephone,
xf_address1,
xf_sex,
xf_dob,
xf_jointdate
ORDER BY a.xf_vipcode;
SUM(case
when a.xf_bonus > 0 then
a.xf_bonus
else
o
end) AS 历史积分
报错了
FROM XF_VIP, XF_BONUSLEDGER a
WHERE a.xf_vipcode BETWEEN '000000004' AND '600010651'
AND a.xf_vipcode = xf_vip.xf_vipcode
GROUP BY a.xf_vipcode,
xf_surname,
xf_telephone,
xf_address1,
xf_sex,
xf_dob,
xf_jointdate
ORDER BY a.xf_vipcode;
SUM(case
when a.xf_bonus > 0 then
a.xf_bonus
else
o
end) AS 历史积分
报错了o改为0,看到了
FROM XF_VIP, XF_BONUSLEDGER a
WHERE a.xf_vipcode BETWEEN '000000004' AND '600010651'
AND a.xf_vipcode = xf_vip.xf_vipcode
GROUP BY a.xf_vipcode,
xf_surname,
xf_telephone,
xf_address1,
xf_sex,
xf_dob,
xf_jointdate
ORDER BY a.xf_vipcode;
SUM(case
when a.xf_bonus > 0 then
a.xf_bonus
else
o
end) AS 历史积分
报错了把else o 改成 else 0.。。我敲错了。另外,楼主居然不知道case语法,那我怀疑楼主是搞oracle开发的么??
FROM XF_VIP, XF_BONUSLEDGER a
WHERE a.xf_vipcode BETWEEN '000000004' AND '600010651'
AND a.xf_vipcode = xf_vip.xf_vipcode
GROUP BY a.xf_vipcode,
xf_surname,
xf_telephone,
xf_address1,
xf_sex,
xf_dob,
xf_jointdate
ORDER BY a.xf_vipcode;
SUM(case
when a.xf_bonus > 0 then
a.xf_bonus
else
o
end) AS 历史积分
报错了把else o 改成 else 0.。。我敲错了。另外,楼主居然不知道case语法,那我怀疑楼主是搞oracle开发的么??
我只是学生
select a.xf_vipcode,xf_surname,xf_telephone,xf_address1,xf_sex, xf_dob,xf_jointdate,
--将所有积分求和作为当前积分
SUM(a.xf_bonus) AS 当前积分 , SUM(a.xf_amount) AS 购买金额,
--将所有积分先和0对比,取比较大的那个求和,也就是将所有整数求和,获得历史积分
SUM(GREATEST(a.xf_bonus,0)) AS 历史积分 FROM XF_VIP xv
--以会员卡表左连接整个积分表,获得总积分信息
inner join XF_BONUSLEDGER a on xv.xf_vipcode = a.xf_vipcode
WHERE (a.xf_vipcode BETWEEN '000000004' AND '600010651') GROUP BY a.xf_vipcode,xf_surname,xf_telephone,xf_address1,xf_sex, xf_dob,xf_jointdate ORDER BY a.xf_vipcode ;
如果查询所有客户的信息,吧inner join 改为left join