【问题标题】:How to get count and Percentage using SQL?如何使用 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:是的

标签: sql sql-server


【解决方案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
      

      【讨论】:

      • 嗨,埃里克。你的答案是有效的。但是我修改了我的问题。你能帮我找到解决办法吗?
      猜你喜欢
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2010-10-20
      相关资源
      最近更新 更多