如何使用 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 count
和 Count1
和 Count0
显示百分比。帮我修改上面的解决方案。 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 获取计数和百分比?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Powershell脚本获取Azure VM来宾指标(性能计数器)