Sql 如何根据列值获取百分比?

Sql 如何根据列值获取百分比?,sql,tsql,sql-server-2008-r2,Sql,Tsql,Sql Server 2008 R2,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

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条是空白的,但它们不计算百分比,只计算有名称的记录。我想知道在10条记录中,Sam占总记录的百分比是多少,因此Sam%将为50

查询应返回

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'
您可以尝试以下方法:

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

每个人似乎都在使用子查询或派生表。这应该表现良好,并且易于遵循。试一试:

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%

是否有可用的Id或主键?我们可以假设所有受影响的行的日期都是相同的吗?当你说空白时,你是指null还是空白?当我说空白时,我是指空白@ughai,thanks@Serv没有主键,日期会有所不同,因为数据是整个月的,因此,我需要知道Sam每天占其他客户的百分比。OP要求每个日期有一个客户。所以count*不是一个选项,我想让我们将其他客户视为一个,我只需要Sam在按日期分组的整个列表中的百分比,谢谢,我想我现在就知道了。获取此错误“CONCAT”不是公认的内置函数名@Stephan。我正在运行sql server 2008,但仅在2012年及更高版本中才允许使用CONCAT。我会搞定的。你真棒,工作得很有魅力@Stephan。你能帮我写这篇文章吗?我怎样才能让这篇文章只对山姆有效,我真的不在乎其他客户。只需要知道Sam代表@Andomar的百分比,谢谢
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%