SQL查询将列拆分为多行除以百分比

时间:2015-09-17 14:36:58

标签: sql tsql sql-server-2012

如何获取列的百分比,然后将其作为行插入

Col1    item    TotalAmount**
1        ABC    5558767.82
2        ABC    4747605.5
3        ABC    667377.69
4        ABC    3844204
6        CTB    100
7        CTB    500.52

我需要为每个项目创建一个新的列百分比,这是我做过的: - 选择项目,(来自table1的totalAmount / select sum(totalAmount))为百分比 从table1 逐项分组

Col1    item    TotalAmount      percentage
1       ABC     5558767.82       38
2       ABC     4747605.5        32
3       ABC     667377.69        5
4       ABC     3844204          26
6       CTB     100              17
7       CTB     500.52           83

现在,复杂的部分我必须通过将此百分比乘以另一个表中的数量来计算另一个数量,即table2 ii)通过将表1的总量列溢出为2行来更新总量列 - 新计算PledgeAmount和第2行的第1行 - (totalAmount - PledgeAmount)

*选择t1.percentage * t2.new金额为[PledgeAmount] 从表1加入table2,其中t1.item = t2.item *

。例如对于col1,数量为5558767.82将分为两行。 最终结果样本: -

Col1    item    TotalAmount   Type   
1       ABC     363700.00     Pledge
1       ABC     5195067.82    Unpledge

...

我正在使用临时表来进行计算。 我认为其中一种方法是将Pledged和Unpledged数量计算为新列并透视它,但是它的数百个列的巨大表格将无法快速执行。

还有其他任何有效的方式吗?

2 个答案:

答案 0 :(得分:0)

您可以使用窗口函数来解决此问题 - 首先在子查询中计算总数,然后在主查询中计算百分比:

 Select *, (totalAmount/total_for_item)*100 as percent_of_total
 from (
   SELECT t.*,
          SUM(totalAmount) OVER (PARTITION BY item) as total_for_item
   FROM table t
 ) sub

答案 1 :(得分:0)

首先,让我们获得每件物品的总金额:

Collection.sort(ip_Object_List, new IPListComparator);

现在很容易达到百分比:

SELECT item, SUM( totalAmount ) as sumTotal
INTO #totalperitem
FROM table1
GROUP BY item

棘手的部分:SELECT t1.Col1, t1.item, t1.totalAmount, t1.totalAmount/tpi.sumTotal*100 AS percentage FROM table1 t1 INNER JOIN #totalperitem tpi on ... 中有/无匹配的行。可以使用table2或我的偏好使用单个外部联接来完成:

WHERE NOT EXISTS

基本技巧是根据SELECT t1.item, CASE WHEN tpledged.item IS NULL THEN "Unpledged" ELSE "Pledged" END, SUM( t1.totalAmount ) AS amount FROM table1 t1 LEFT OUTER JOIN table2 tpledged ON t1. ... = tpledged. ... GROUP BY t1.item, CASE WHEN tpledged.item IS NULL THEN "Unpledged" ELSE "Pledged" END 中是否存在记录创建一个人工列,并按人工列分组。