-1

我目前运行查询:

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)。

4

2 回答 2

0

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

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

这是一个指向SQL Fiddle的链接,其中包含我用于测试的数据......

如果要在结果列中添加“%”符号,则需要将百分比值转换为VARCHAR并添加符号。

CONVERT(VARCHAR(20), @PercentageValue) + '%' AS PercentageValue
于 2013-05-29T18:53:13.490 回答
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。

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

于 2013-05-29T19:12:49.037 回答