一张表:TB
记录了超市会员等级历史字段有:
会员号,会员等级 ,升级开始日期 ,原等级
其中等级名称包括 普通、黄金、白金
还有一张表 TB1
字段有:会员号,消费金额
也就是说会员每次消费就会记录一次他的消费金额。
现在要的报表

其中总人数为一个类别(例如:普通会员->黄金会员)的总人数,平均消费次数为一个类别消费次数/总人数,
平均消费金额为一个类别的消费金额/总人数,升级平均所用天数是一个类别升级日期(天)的汇总/总人数。
------解决思路----------------------
即有 普通--黄金 又有 普通--白金,可以假定TB中会员号是唯一的。
WITH a (原等级,会员等级,总人数,总天数)
AS (
SELECT 原等级,
会员等级,
COUNT(*),
SUM(DATEDIFF(day,升级开始日期,GetDate())+1)
FROM TB
GROUP BY 原等级,会员等级
),
b (原等级,会员等级,消费总次数,消费总金额)
AS (
SELECT TB.原等级,
TB.会员等级,
COUNT(*),
SUM(TB1.消费金额)
FROM TB
JOIN TB1 -- 没有消费记录的应该不会升级,所以不用 LEFT JOIN 了
ON TB.会员号 = TB1.会员号
GROUP BY TB.原等级,TB.会员等级
)
SELECT a.原等级 + '--' + a.会员等级,
a.总人数,
b.消费总次数 / a.总人数,
b.消费总金额 / a.总人数
FROM a
JOIN b
ON a.原等级 = b.原等级
AND a.会员等级 = B.会员等级
------解决思路----------------------
表设计不太好。假如有这样的数据怎么存?
一个普通会员,一次性消费很大数额,直接从普通会员跳到白金,那么原始数据怎么存?报表结果怎么查(报表第三行肯定+1,但第一二行,还算此人么?)