根据查询结果计算百分比

时间:2013-05-29 16:53:32

标签: sql-server select percentage

我目前正在运行查询:

select table1.columnA as Barrier_1,
       table2.columnB as Action_1,
  from table2
  join table1 on table2.PrimKey = table1.PrimKey
 where table1.columnA is not null
   and table2.columnB is not null
 group by table1.columnA, table2.columnB
 order by table1.columnA

返回表格:

Barrier_1   Action_1
____________________
   01     |    01
   01     |    02
   02     |    01
   02     |    03
   02     |    04
   03     |    02
   03     |    03
   04     |    01
   05     |    04

我想要它做的是计算每个障碍的每个动作的百分比:

Barrier_1   Action_1   Percent_1
________________________________
   01     |    01    |   60%
   01     |    02    |   40%
   02     |    01    |   20%
   02     |    03    |   10%
   02     |    04    |   70%
   03     |    02    |   20%
   03     |    03    |   80%
   04     |    01    |  100%
   05     |    04    |  100%

请注意,每个操作可以显示多个时间障碍。

所以每个障碍都有它自己的一系列动作。例如,屏障一个可以总共有5个动作(2个是动作02,3个是动作01)。

2 个答案:

答案 0 :(得分:0)

您可以使用子查询获取一个Actions的所有Barrier的总和。然后计算一个Actions的{​​{1}}百分比。

Barrier

此处指向SQL Fiddle的链接,其中包含我用于测试的数据...

如果您想在结果列中添加'%' - 符号,则需要将百分比值转换为SELECT b.ColumnA , a.ColumnB , ROUND(CONVERT(DECIMAL(19,4), COUNT(a.ColumnB))* 100/ CONVERT(DECIMAL(19,4), (SELECT COUNT(ColumnB) FROM Action WHERE PrimKey=b.PrimKey)) , 2) AS Pros FROM Action a INNER JOIN Barrier b ON b.PrimKey=a.PrimKey GROUP BY b.ColumnA, a.ColumnB, b.PrimKey ORDER BY b.ColumnA 并添加符号。

VARCHAR

答案 1 :(得分:0)

有许多不同的方法可以解决这个问题。以下是我认为最直接的例子:

SELECT table1.columnA as Barrier_1,
   table2.columnB as Action_1,
   ROUND(CAST(COUNT(*) AS FLOAT)
            /CAST(  (SELECT COUNT(*) FROM table2 t2 
                        WHERE t2.PrimKey = table1.PrimKey)
                    AS FLOAT)*100,2) AS Percent_1
  from table2
  join table1 on table2.PrimKey = table1.PrimKey
 where table1.columnA is not null
   and table2.columnB is not null
 group by table1.columnA, table2.columnB
 order by table1.columnA

如果要添加百分比符号,则必须在结尾处转换为varchar。

注意:我在示例中转换为float类型,如果您需要高精度的数字,最好使用数字/小数类型