使用COUNT和返回百分比对记录的SUM

时间:2014-08-13 14:34:46

标签: sql sql-server sql-server-2012

我想这是一个非常简单的问题,但我无法在这里找到答案!

我试图根据WHERE子句计算记录量,并根据相同的where子句返回这些记录的百分比。百分比将根据数据库中的记录总数计算。例如,我计算所有符合" MyCondition":

的记录
SELECT COUNT(*) FROM [MyTable]     
WHERE Condition='MyCondition'

这很好用。但是,如何计算,并返回与数据库中的所有记录相对应的百分比?换句话说,我想看到有多少记录符合WHERE条件=' MyCondition'关于总记录数。

抱歉这个简单的问题和TIA!我正在使用MS SQL 2012。

3 个答案:

答案 0 :(得分:3)

这是另一种只触及基表一次的方法。

SELECT COUNT(*) as TotalCount
    ,SUM(case when Condition = 'MyCondition' then 1 else 0 end) as ConditionalCount
FROM [MyTable]     

答案 1 :(得分:2)

您可以简单地将计数的匹配除以记录总数。

示例数据:

create table test (MatchColumn int)

insert into test (MatchColumn)
values (1),(1),(1),(2),(3),(4)

匹配条件:

SELECT COUNT(*) MatchValues, 
      (SELECT COUNT(*) FROM test) TotalRecords,
      CAST(COUNT(*) AS FLOAT)/CAST((SELECT COUNT(*) FROM test) AS FLOAT)*100 Percentage
FROM [test]     
WHERE MatchColumn=1

<强>返回:

| MATCHVALUES | TOTALRECORDS | PERCENTAGE |
|-------------|--------------|------------|
|           3 |            6 |         50 |

SQL Fiddle Demo

使用CTE:

另一个选择是使用 CTE 执行相同操作并引用它创建的列:

;WITH CTE AS 
  (SELECT COUNT(*) MatchValues, 
      (SELECT COUNT(*) FROM test) TotalRecords      
   FROM [test]     
   WHERE MatchColumn=1)
SELECT MatchValues, TotalRecords, 
       CAST(MatchValues AS FLOAT)/CAST(TotalRecords AS FLOAT)*100 Percentage
FROM CTE

SQL Fiddle Demo

注意:需要将计数转换为float以计算百分比,因为除以2 int个值将返回int,但在这种情况下我们想要一个小于0的十进制值,如果它是int,那么它就是0。

参考:

SQL Server, division returns zero

答案 2 :(得分:0)

或类似的东西。

create table test (MatchColumn int)
insert into test (MatchColumn)
values (1),(1),(1),(2),(3),(4)

SELECT
(SELECT COUNT(*) FROM test WHERE MatchColumn=1) MatchValues, 
(SELECT COUNT(*) FROM test) TotalRecords,
((SELECT CAST(COUNT(*) AS FLOAT) FROM test WHERE MatchColumn=1)/CAST((SELECT COUNT(*) FROM test) AS FLOAT)*100) Percentage