Sql server 2005 在SQL Server 2005中从成员资格表中查找删除率
我们有一个观点,存储我们的会员持有的会员计划的历史,我们已经运行了一段时间的半价直接借记报价。我们被要求报告人们是否允许直接借记续费(全额),但我不是SQL专家 实际上的观点是Sql server 2005 在SQL Server 2005中从成员资格表中查找删除率,sql-server-2005,reporting,Sql Server 2005,Reporting,我们有一个观点,存储我们的会员持有的会员计划的历史,我们已经运行了一段时间的半价直接借记报价。我们被要求报告人们是否允许直接借记续费(全额),但我不是SQL专家 实际上的观点是 memberRef,historyRef,validFrom,validTo,MembershipType,PaymentType,totalAmount 这里 memberRef标识人员(int) historyRef标识此行(int) validFrom和validTo是计划的开始和结束(日期时间) Members
memberRef,historyRef,validFrom,validTo,MembershipType,PaymentType,totalAmount
这里
- memberRef标识人员(int)
- historyRef标识此行(int)
- validFrom和validTo是计划的开始和结束(日期时间)
- MembershipType是计划的类型(int)
- PaymentType是直接借记卡或信用卡(字符串-DD或EFT)
- totalAmount是计划的价格(十进制)
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
)
这将显示具有半价计划且有效起始日期大于该计划有效起始日期的成员
不完全正确,因为我们应该测试它是相同的计划,但
如果我将select here更改为just count(memberRef),我将获得我正在分组的成员的memberRef计数,即对于5220个结果,我将返回5220行,每个行实际上包含我选择的计划数
但我需要计算接受该提议的人数和续约比例。此外,不接受该提议的人群中的更新率(我猜这是一个很小的变化,一旦我得到一组排序)
我想我在看一个人是如何在集合上操作的,但是在不使用光标的情况下比较每个不同的人的多行。但我可能错了:)试试以下方法:
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?'
选择
a、 *,b*
从你的桌子上
在a.memberRef=b.memberRef和a.validToDate上内部联接表b尝试以下操作:
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?'
选择
a、 *,b*
从你的桌子上
在a.memberRef=b.memberRef和a.validToDateI上内部联接表b我需要更多地了解数据库(表、列及其内容的含义),然后才能解决这个问题@Philip我也猜到了:-)在解决这个问题之前,我需要更多地了解您的数据库(表、列及其内容的含义)@菲利普:我也猜到了:-)这为我指明了正确的方向。另外,因为我也完全自学了SQL,所以我不知道您可以像这样直接向联接添加条件,所以您为我解决了另一个问题。耶!这为我指明了正确的方向。另外,因为我也完全自学了SQL,所以我不知道您可以像这样直接向联接添加条件,所以您为我解决了另一个问题。耶!