如何使用 SQL 获取计数和百分比?

Posted

技术标签:

【中文标题】如何使用 SQL 获取计数和百分比?【英文标题】:How to get count and Percentage using SQL? 【发布时间】:2015-01-06 06:08:53 【问题描述】:

下面给出的是数据库表(TableA)。

SlNo  TeamName  WorkInfo 
----  -------   -------  
1     Team1        0    
2     Team1        0    
3     Team1        1     
4     Team2        1    
5     Team2        1 
6     Team2        1      
7     Team3        0      
8     Team3        1      

我有两个用于选择开始日期和结束日期的文本框。我想显示这两个日期之间的详细信息。

鉴于以下查询是根据开始日期和结束日期提供详细信息和计数。

SELECT TeamName,Count(DISTINCT CASE WHEN WorkInfo = 1 THEN SlNo end) AS Count1 , 
       Count(DISTINCT CASE WHEN WorkInfo = 0 THEN SlNo end) AS Count0 FROM tableA 
WHERE (SubmitDate BETWEEN @start AND @end) GROUP BY TeamName

上面的查询显示了如下所示的输出:

TeamName   Count1   Count0
--------   -----    ------
Team1        1        2
Team2        3        0
Team3        1        1

我想根据 greatest countCount1Count0 显示百分比。帮我修改上面的解决方案。 The expecting output sample is given below:

Count1 3 是最大的值。基于此,我必须找到 Count1 值的百分比。而在Count0 中,2 是最大值。基于此我必须找到 Count0 值的百分比。

TeamName   Count1   Count0  Percentage1  Percentage0
--------   -----    ------  -----------  -----------
Team1        1        2        33.33%         100%
Team2        3        0        100%           0%
Team3        1        1        33.33%         50%  

帮助我找到合适的解决方案。谢谢。

【问题讨论】:

你在使用 SQL Server 吗? @RaduGheorghiu:是的 【参考方案1】:

为了在 SQL 中显示占总数的百分比,我们希望利用我们用于排名/运行总数加子查询的想法。与我们在 SQL 子查询部分看到的不同,这里我们希望将子查询用作 SELECT 的一部分。让我们用一个例子来说明。假设我们有下表,

Name    Sales
John    10
Jennifer    15
Stella  20
Sophia  40
Greg    50
Jeff    20

我们会打字,

SELECT a1.Name, a1.Sales, a1.Sales/(SELECT SUM(Sales) FROM Total_Sales) Pct_To_Total 
FROM Total_Sales a1, Total_Sales a2 
WHERE a1.Sales <= a2.sales or (a1.Sales=a2.Sales and a1.Name = a2.Name) 
GROUP BY a1.Name, a1.Sales 
ORDER BY a1.Sales DESC, a1.Name DESC;

结果:

Name    Sales   Pct_To_Total
Greg    50  0.3226
Sophia  40  0.2581
Stella  20  0.1290
Jeff    20  0.1290
Jennifer    15  0.0968
John    10  0.0645

子查询SELECT SUM(Sales) FROM Total_Sales 计算总和。然后,我们可以将各个值除以该总和,以获得每行的总百分比。

参考是here

【讨论】:

【参考方案2】:

这是你要问的还是我完全错了?

exec ('SELECT TeamName,Count(DISTINCT CASE WHEN WorkInfo = 1 THEN SlNo end) AS Count1 , Count(DISTINCT CASE WHEN WorkInfo = 0 THEN SlNo end) AS Count0, ((Count(DISTINCT CASE WHEN WorkInfo = 1 THEN SlNo end)/'+ @totaldays + ')*100) as Percentage1, ((Count(DISTINCT CASE WHEN WorkInfo = 0 THEN SlNo end)/' + @totaldays + ')*100) as Percentage0 FROM tableA WHERE (SubmitDate BETWEEN ' + @start ' + AND ' + @end + ') GROUP BY TeamName')

【讨论】:

【参考方案3】:

如果百分比基于开始日期和结束日期不同的日期,而不是数据本身

SELECT 
  TeamName,
  Count(DISTINCT CASE WHEN WorkInfo = 1 THEN SlNo end) AS Count1, 
  Count(DISTINCT CASE WHEN WorkInfo = 0 THEN SlNo end) AS Count0,
  Count(DISTINCT CASE WHEN WorkInfo = 1 THEN SlNo end) * 100.0 / (DATEDIFF(Day, @start, @end) + 1) AS Percentage1,
  Count(DISTINCT CASE WHEN WorkInfo = 0 THEN SlNo end) * 100.0 / (DATEDIFF(Day, @start, @end) + 1) AS Percentage0
FROM 
  tableA 
WHERE 
  (SubmitDate BETWEEN @start AND @end) 
GROUP BY 
  TeamName

【讨论】:

嗨,埃里克。你的答案是有效的。但是我修改了我的问题。你能帮我找到解决办法吗?

以上是关于如何使用 SQL 获取计数和百分比?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中获取表格,包括计数、相对频率和累积频率?

如何使用Powershell脚本获取Azure VM来宾指标(性能计数器)

如何使用 sql 中的单个查询获取项目计数和总计数?

使用内部连接时如何在 sql server 中获取计数?

如何使用 SQL 获取 2 列之间日期差异的计数(值的分布)?

如何使用与计数不同语句相关的百分比创建附加列