求sql语句(200分)

  • 主题发起人 主题发起人 kid
  • 开始时间 开始时间
K

kid

Unregistered / Unconfirmed
GUEST, unregistred user!
现有这样一个数据表有近10万条记录,示例如下:
会员卡号 连锁专营点名 消费金额 月份
1000 a1 100 10
1000 a2 300 10
1000 a3 150 10
1001 a2 50 10
1001 a3 400 10
1001 a4 400 10
---------------------------------------
现要求对以上记录进行分析筛选,如果同个会员在不同专营点都有消费,那么按消费金额大
小比较,保留下消费金额最大的那条记录,如果消费金额也相同则任意保留一条记录,分析
筛选结果要如下:
会员卡号 连锁专营点名 消费金额 月份
1000 a2 300 10
1001 a3 400 10
以前数据表在foxpro6中可以用下面这语句得到结果:
select distinct 会员卡号, 连锁专营点名, max(消费金额), 月份 from 表1 group by 会
员卡号;
现在数据表移到access和sql2000中,就提示上面那条sql语句是错的,group by 之后一定
要有group by 会员卡,连锁专营点名,月份。这样查询得不到要求的结果。
请教各位,要如何做才能得到要求的数据结果。
 
select 会员卡号,MAX( 连锁专营点名), max(消费金额), mAX(月份) from 表1 group by 会
员卡号;
 
select a.* from table a,(select 会员卡号,月份, max(消费金额) 消费金额 from 表1 group by 会
员卡号,月份) b where a.会员卡号=b.会员卡号 and a.消费金额=B.消费金额
 
select 会员卡号,月份,max(消费金额), MAX( 连锁专营点名) from 表1 group by 会员卡号,月份
 
select a.* from a inner join (select 会员卡号,max(消费金额) 消费金额 from 表1 group by 会员卡号) b on a.会员卡号=b.会员卡号 and a.消费金额=B.消费金额
 
这个查询有点意思,语句说明:
1、最内层的select取出同一卡号最大的消费额
2、次内层的select取出如果最大额相同的取任一连锁专营点名,当然用min也可以
3、第三层的select过滤如果在同一店两个月各有一次消费,金额相同,且是最大金额
4、最外层规律掉,如果同一月同店两次消费,金额相同,且是最大金额
select distinct T5.*
from 表1 T5,
(select T3.会员卡号,T3.连锁专营点名,T3.消费金额,Max(月份) 月份
from 表1 T3,
(select T1.会员卡号,max(连锁专营点名) 连锁专营点名,T1.消费金额
from 表1 T1,(select 会员卡号,max(消费金额) 消费金额
from 表1 group by 会员卡号
)T0 where T1.会员卡号=T0.会员卡号 and T1.消费金额=T0.消费金额
group by T1.会员卡号,T1.消费金额
)T2 where T3.会员卡号=T2.会员卡号 and T3.消费金额=T2.消费金额
and T3.连锁专营点名=T2.连锁专营点名
group by T3.会员卡号,T3.消费金额,T3.连锁专营点名
)T4 where T5.会员卡号=T4.会员卡号 and T5.消费金额=T4.消费金额
and T5.连锁专营点名=T4.连锁专营点名 and T5.月份=T4.月份

效率可能慢。
 
所有非计算字段都应该列在group by子句中,所以你的那个句子报错。
distinct 是以所有列出的字段为判断记录是否唯一的标准,所以在你的查询中可能每条记录都是唯一的。
"如果同个会员在不同专营点都有消费,那么按消费金额大小比较"---不考虑专营点不同吗?
试试这个(access中):
select a.专营点名, b.会员卡号,b.消费金额, b.月份 from ((select * from 表名)a left join (select 会员卡号,月份, max(消费金额) as 消费金额 from 表名 group by 会员卡号,月份)b where a.会员卡号=b.会员卡号 and a.消费金额=B.消费金额)
 
问题解决,多谢。
 
后退
顶部