当前位置: 代码迷 >> Sql Server >> 挑战啊有难度。该如何解决
  详细解决方案

挑战啊有难度。该如何解决

热度:89   发布时间:2016-04-24 10:00:58.0
挑战啊,有难度。
一张表: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,但第一二行,还算此人么?)
  相关解决方案