2012-10-25 275 views
2

我有一个健康俱乐部的SQL Server数据库中的客户列表。 客户列出了他们加入的日期和更新的次数 我希望能够计算续订客户的百分比率。关于如何做到这一点的任何想法?谢谢。TSQL计算百分比

+3

你怎么知道他们没有?每个客户的到期日期?或者所有成员资格都是相同的长度,例如一个月?你是否在意他们的会员资格是不连续的? – HABO

+0

闻起来像功课。 – invert

+0

@invert是否会使问题变得更加有效? –

回答

1

这是你正在寻找

Declare @t table(Id Int Identity,CustomerName Varchar(50),DOJ Datetime,IsRenewed bit) 
Insert Into @t Values('Name1','1/1/2012',1),('Name2','10/1/2012',1),('Name3','10/2/2012',0) 

Select PercentageCustomerRenewed = 
Cast((Count(*) * 100)/(Select Count(*) From @t) AS Numeric(10,2)) 
From @t 
where IsRenewed = 1 

结果什么

PercentageCustomerRenewed 
66.00 
+0

您可以发布样本数据,并期望outout ..所以你可以很容易地得到解决方案 –

+0

这是我迄今为止。我可以使查询的第一部分工作,但我无法正确地将两个select语句组合在一起。 - 第1部分:RenewalCount =次数 - 每个客户续订 SELECT * FROM (SELECT JoinDate,RenewalCount,YEAR(getdate()) - YEAR(JoinDate) - CASE WHEN MONTH(GETDATE())> MONTH GETDATE()) 或者MONTH(GETDATE())= MONTH(GETDATE())和DAY(GETDATE())> = DAY(GETDATE())then 0 else 1 end AS PotentialRenewal FROM Table)percRenewal --Part 2 选择100.0 * SUM(更新)/ SUM(潜在更新) 从表AS percRenewal – steve

3

如果有一个表subscriptions每个用户只有一行,是被带着几分isrenewed更新:

SELECT 
    SUM(SIGN(isrenewed)) * 100/COUNT(*) 
    AS Percentage 
    FROM subscriptions 

输出

Percentage 
--------------- 
66,666666 

如果你想圆表达

Percentage 
--------------- 
66 

如果你有一个表subscriptions用户特定的列userid这里有你可以将它转换为int

SELECT 
    CAST(
     SUM(SIGN(isrenewed)) * 100/COUNT(*) 
     AS int) 
    AS Percentage 
    FROM subscriptions 

输出两排意味着订阅被续订:

SELECT 
    (SELECT TOP 1 COUNT(*) OVER() 
    FROM subscriptions 
    GROUP BY userid 
    having COUNT(*) > 1) 
    * 100/COUNT(*) AS Percentage 
    FROM subscriptions 
+0

感谢您的答案。 Jan用子查询来做这个方法比第一篇文章要容易一些。他们续约时没有2个条目。有一个字段说明更新并列出客户续订的次数。我仍然能够使用你的方法吗?谢谢。 – steve

+0

更新了我的答案,这是第二个。 – Jan

+0

谢谢。我想出一个没有道理的数字。我将不得不对此做更多的研究。 – steve