如何根据列值获得百分比?
how to get a percentage depending on a column value?
更新 2015 年 5 月 18 日
有一个列有客户姓名的列。我怎样才能得到基于每个日期一个客户的百分比?例如
CustomerName Date
Sam 04/29/15
Joy 04/29/15
Tom 04/29/15
Sam 04/29/15
Oly 04/29/15
Joy 04/29/15
04/29/15
Sam 04/29/15
04/29/15
Sam 04/29/15
Oly 04/29/15
Sam 04/29/15
Oly 04/30/15
Joy 05/01/15
请注意,我的列有 12 条记录,其中 2 条为空白,但它们不计算百分比,只计算有名称的记录。我想知道 Sam 在总数中所占的百分比(在本例中为 10 条记录,因此 Sam % 将为 50)。
查询应该return
Date Percentage
04/29/15 50
04/30/15 0
05/01/15 0
更新
我真的不关心其他客户,所以让我们把他们当作一个。只需要知道 Sam 在总列表中的百分比。
任何帮助将不胜感激。谢谢
你会做这样的事情
SELECT (COUNT(*) * 100) / (SELECT COUNT(*) FROM Customer WHERE CustomerName <> '' AND Date = '04/29/15')
FROM Customer
WHERE CustomerName = 'Sam'
AND Date = '04/29/15'
如果你想获得每个日期的count
,你可以使用这个
SELECT T.Date,((ISNULL(CustomerCount,0) * 100) / TotalCount)
FROM
(
SELECT COUNT(*) as TotalCount,Date
FROM Customer
WHERE CustomerName <> ''
GROUP BY Date
)T
LEFT JOIN
(
SELECT COUNT(*)
FROM Customer
WHERE CustomerName = 'Sam'
GROUP BY Date
)C
ON T.Date = C.Date
你可以试试这个:
select name, date, (100.0 * count(*)) /
(select count(*) from table t2
where name is not null and name <> '' and t2.date = t1.date)
from table t1
where name is not null and name <> ''
group by name, date
对于所有用户
SELECT
(COUNT(*) * 100) / (SELECT COUNT(*) FROM Customer WHERE CustomerName <> '') as [percent],
CustomerName
FROM Customer group by CustomerName
针对特定用户
SELECT
(COUNT(*) * 100) / (SELECT COUNT(*) FROM Customer WHERE CustomerName <> '') as [percent],
CustomerName
FROM Customer where CustomerName ='Sam'
您可以在子查询中计算每人+天的人数:
select Date
, CustomerName
, 100.0 * cnt / sum(cnt) over (partition by date)
from (
select Date
, CustomerName
, count(*) cnt
from table1
where CustomerName <> ''
group by
Date
, CustomerName
) t1
这会打印:
Date CustomerName
----------------------- ------------ ---------------------------------------
2015-04-29 00:00:00.000 Joy 20.000000000000
2015-04-29 00:00:00.000 Oly 20.000000000000
2015-04-29 00:00:00.000 Sam 50.000000000000
2015-04-29 00:00:00.000 Tom 10.000000000000
(4 row(s) affected)
似乎每个人都在使用子查询或派生表。这应该表现良好并且很容易遵循。试试看:
DECLARE @CustomerName VARCHAR(5) = 'Sam';
SELECT [Date],
@CustomerName AS CustomerName,
percentage = CAST(CAST(100.0 * SUM(CASE WHEN CustomerName = @CustomerName THEN 1 ELSE 0 END)/COUNT(*) AS INT) AS VARCHAR(20)) + '%'
FROM @yourTable
WHERE CustomerName != ''
GROUP BY [Date]
结果:
Date CustomerName percentage
---------- ------------ ---------------------
2015-04-29 Sam 50%
2015-04-30 Sam 0%
2015-05-01 Sam 0%
更新 2015 年 5 月 18 日
有一个列有客户姓名的列。我怎样才能得到基于每个日期一个客户的百分比?例如
CustomerName Date
Sam 04/29/15
Joy 04/29/15
Tom 04/29/15
Sam 04/29/15
Oly 04/29/15
Joy 04/29/15
04/29/15
Sam 04/29/15
04/29/15
Sam 04/29/15
Oly 04/29/15
Sam 04/29/15
Oly 04/30/15
Joy 05/01/15
请注意,我的列有 12 条记录,其中 2 条为空白,但它们不计算百分比,只计算有名称的记录。我想知道 Sam 在总数中所占的百分比(在本例中为 10 条记录,因此 Sam % 将为 50)。
查询应该return
Date Percentage
04/29/15 50
04/30/15 0
05/01/15 0
更新
我真的不关心其他客户,所以让我们把他们当作一个。只需要知道 Sam 在总列表中的百分比。
任何帮助将不胜感激。谢谢
你会做这样的事情
SELECT (COUNT(*) * 100) / (SELECT COUNT(*) FROM Customer WHERE CustomerName <> '' AND Date = '04/29/15')
FROM Customer
WHERE CustomerName = 'Sam'
AND Date = '04/29/15'
如果你想获得每个日期的count
,你可以使用这个
SELECT T.Date,((ISNULL(CustomerCount,0) * 100) / TotalCount)
FROM
(
SELECT COUNT(*) as TotalCount,Date
FROM Customer
WHERE CustomerName <> ''
GROUP BY Date
)T
LEFT JOIN
(
SELECT COUNT(*)
FROM Customer
WHERE CustomerName = 'Sam'
GROUP BY Date
)C
ON T.Date = C.Date
你可以试试这个:
select name, date, (100.0 * count(*)) /
(select count(*) from table t2
where name is not null and name <> '' and t2.date = t1.date)
from table t1
where name is not null and name <> ''
group by name, date
对于所有用户
SELECT
(COUNT(*) * 100) / (SELECT COUNT(*) FROM Customer WHERE CustomerName <> '') as [percent],
CustomerName
FROM Customer group by CustomerName
针对特定用户
SELECT
(COUNT(*) * 100) / (SELECT COUNT(*) FROM Customer WHERE CustomerName <> '') as [percent],
CustomerName
FROM Customer where CustomerName ='Sam'
您可以在子查询中计算每人+天的人数:
select Date
, CustomerName
, 100.0 * cnt / sum(cnt) over (partition by date)
from (
select Date
, CustomerName
, count(*) cnt
from table1
where CustomerName <> ''
group by
Date
, CustomerName
) t1
这会打印:
Date CustomerName
----------------------- ------------ ---------------------------------------
2015-04-29 00:00:00.000 Joy 20.000000000000
2015-04-29 00:00:00.000 Oly 20.000000000000
2015-04-29 00:00:00.000 Sam 50.000000000000
2015-04-29 00:00:00.000 Tom 10.000000000000
(4 row(s) affected)
似乎每个人都在使用子查询或派生表。这应该表现良好并且很容易遵循。试试看:
DECLARE @CustomerName VARCHAR(5) = 'Sam';
SELECT [Date],
@CustomerName AS CustomerName,
percentage = CAST(CAST(100.0 * SUM(CASE WHEN CustomerName = @CustomerName THEN 1 ELSE 0 END)/COUNT(*) AS INT) AS VARCHAR(20)) + '%'
FROM @yourTable
WHERE CustomerName != ''
GROUP BY [Date]
结果:
Date CustomerName percentage
---------- ------------ ---------------------
2015-04-29 Sam 50%
2015-04-30 Sam 0%
2015-05-01 Sam 0%