2013-05-29 63 views
-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)。

+2

你能对你的意思是'什么扩大每个屏障的每个动作的百分比? –

+0

你用什么公式来计算每一行。例如屏障05与行动04.行动04存在两次屏障05只有一次为什么它是100%vs屏障04与行动01(有3个条目)在100%? – xQbert

+0

所以每个障碍都有自己的一套行动。例如,障碍物可以总共有5个动作(2个为动作02,3个为动作01)。希望能够回答这两个问题。 – rjbogz

回答

0

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

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 
+0

这将如何与我的查询虽然工作?我没有第三张桌子可以使用。它只是Barriers表(table1)和Actions表(表2),除非是临时表,否则我无法创建新表。也许我错过了什么? – rjbogz

+0

@ user1911612,我更新了两个表的答案。如果我不适合你,请给你一些表格的结构...... – Fabio

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型的例子,如果你需要在数字的高精确度,最好是使用数字/小数型

+0

这与fabio的答案类似。这是我最初的想法,除了子查询将返回多个值。我需要它对于运行子查询的行是唯一的,如果这样做合理的话。 – rjbogz

+0

我假设你的where子句和/或join子句与你的例子不完全相同?或者我误解了?子查询中的where子句必须与来自该表的原始查询严格一样。 – guitarultimate

+0

@guitarultimate,我不会推荐使用'FLOAT'类型,如果你要'圆'这种类型的值。 'FLOAT'类型知道一些四舍五入的问题:[“浮点值的半舍弃”](http://stackoverflow.com/questions/2370358/round-half-up-on-floatingpoint-values) – Fabio