2015-09-17 85 views
0

划分如何获得一个列的百分比,然后将其插入作为行SQL查询拆分柱为多行按百分比

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 

我需要为这是我做的每一项新列百分比如: - 选择项目(总金额/ SELECT SUM(总金额),从表1)作为百分比 从表1 集团通过项目

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 

现在,复杂的部分我必须通过将这个百分比乘以另一个表的数量来计算另一个数量,如表2 ii)通过将表1的总金额列分散到2行来更新总金额列 - 新计算PledgeAmount的第一行和第二行 - (总金额 - PledgeAmount)

*选择t1.percentage * t2.new量为[PledgeAmount] 从表1表2加入其中t1.item = t2.item *

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

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

....

我使用临时表来做计算。 我认为其中一种方法是将Pledged和Unpledged金额计算为新列并将其转换为数据透视表,但其数百列的巨大表格将无法快速执行。

还有其他有效的方法吗?

+0

“但它的巨大表格有数百列” - 列?真? - 但是,如何避免使用临时表来存储每件商品的总金额。从那里开始应该很容易。 – JimmyB

+0

这3列只是巨大表格的一部分。我已经在Temp表中保留了每件商品的总金额。对不起,我不是很好解释:(我计算的百分比,但部分将总量分成行,通过乘以新的百分比与tabl2和row2作为差异。 –

回答

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

谢谢,但如何分裂或更新原始的第二部分总数为2行? –

+1

我看到......两个问题合在一起,通常在这里皱起眉头......事实上,你的第二部分对我来说毫无意义。请阅读如何提出常见问题解答的问题部分,并用最少的输入和预期输出列出这个问题。 – Hogan

0

首先,让我们每个项目的总金额:

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 

基本的技巧就是在table2创建从存在/不存在的记录的人工列,也组由人工柱。