2010-07-27 52 views
1

我们有一种观点,它存储了我们会员持有的会员计划的历史,并且我们一直在运行半价直接扣账优惠。我们被要求报告人们是否允许直接借记续费(全价),但我不是SQL专家!在SQL Server 2005中查找会员表的退款率

在效果的视图是

memberRef, historyRef, validFrom, validTo,MembershipType,PaymentType,totalAmount

这里

  • memberRef标识
  • historyRef标识此行的人(INT)(INT)
  • validFrom和validTo是计划的开始和结束(日期时间)
  • MembershipType是计划类型(INT)
  • PaymentType是直接的借记卡或信用卡(字符串 - DD或EFT)
  • 总金额是计划(十进制)的价格

我想知道是否有一个查询,而不是一个游标,我可以用它来计算半价政策的数量,并有一个直接的借记政策。

如果我们还可以捕获该人是否以半价首次加入,或者是否存在成员资格已经过期的差距,然后他们采取了非常好的半价奖励措施。

在此先感谢您的帮助!

例如

select count(MemberRef), max(vhOuter.validFrom) "most recent plan start", 
(select top(1) vh2.validFrom 
from v_Membershiphistory vh2 
where (vh2.totalamount = 14.97 or vh2.totalamount = 25.50) 
and vh2.memberref = vhOuter.memberref 
order by createdat desc 
) "half price plan start" 
from v_membershiphistory vhOuter 
where vhOuter.memberref in (select vh1.memberref from v_membershiphistory vh1 where  vh1.totalamount = 14.97 or vh1.totalamount = 25.50)--have taken up offer 
group by memberref 
having max(vhOuter.validFrom) > (select top(1) vh2.validFrom 
           from v_Membershiphistory vh2 
           where (vh2.totalamount = 14.97 or vh2.totalamount = 25.50) 
           and vh2.memberref = vhOuter.memberref 
           order by createdat desc 
          ) 

这将显示谁拥有一半的价格计划,并有一个有效的从比从该计划的日期有效日期越大的成员。

不太正确,因为我们应该测试,这是同样的计划,但...

如果我改变这里的选择仅计算(memberRef)我得到memberRef对我是件计数为每个成员分组,即为5220结果我会得到5220行返回每个有效的我选择的计划数

但我需要计算采取报价的人数和比例更新。另外人口中没有接受报价的更新率(我猜这是一个微不足道的变化,一旦我有一组排序)

我想我正在看一个人如何操作设置但是为每个不同的人比较多行而不使用游标。但我可能是错的:)

+3

我需要知道* *很多更多关于你的数据库(表格,栏目,内容含义),然后才能解决这个问题! – 2010-07-27 14:34:17

+0

@菲利普我猜对了一样多:-) – 2010-07-27 14:49:17

回答

1

尝试类似:

SELECT 
    a.*, b.* 
    FROM YourTable   a 
     INNER JOIN YourTable b On a.memberRef=b.memberRef and a.validToDate<b.validFromDate 
    WHERE b.PaymentType='?direct debit?' and a.Cost='?half price?' 

得到的只是计数使用类似:

SELECT 
    COUNT(a.memberRef) AS TotalCount 
    FROM YourTable   a 
     INNER JOIN YourTable b On a.memberRef=b.memberRef and a.validToDate<b.validFromDate 
    WHERE b.PaymentType='?direct debit?' and a.Cost='?half price?' 
+0

这是指向我在正确的方向。另外,因为我也完全自学SQL,所以我不知道你可以直接向这样的连接添加条件,所以你为我解决了另一个问题。好极了! – 2010-07-28 08:43:16