【问题标题】:SQL query Splitting a column into Multiple rows divide by percentageSQL查询将一列拆分为多行除以百分比
【发布时间】:2015-12-14 11:39:27
【问题描述】:

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

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

我需要为我所做的每个项目创建一个新的列百分比:- 选择项目,(totalAmount/select sum(totalAmount) from table1)作为百分比 从表 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

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

*选择 t1.percentage * t2.new amount 作为 [PledgeAmount] 从表 1 join table2 where t1.item=t2.item*

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

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

....

我正在使用临时表进行计算。 我认为的一种方法是将 Pledged 和 Unpledged 的​​金额计算为新列并将其 Pivot,但它的巨大表包含数百列,它不会快速执行。

还有其他有效的方法吗?

【问题讨论】:

  • "但是它的巨大的表有数百列" -- 列?真的吗? - 但是是什么让您不能简单地使用临时表来存储每件商品的总金额。从那里开始应该很容易。
  • 这 3 列只是巨大表格的一部分。我已经在 Temp 表中保留了每个项目的总金额值。抱歉,我不太擅长解释 :( 我计算了百分比,而是通过将新百分比乘以 tabl2 和 row2 作为差异来将总金额分成行的部分。

标签: sql tsql sql-server-2012


【解决方案1】:

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

 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

【讨论】:

  • 谢谢,但是第二部分将原始总金额拆分或更新为 2 行怎么样?
  • 我明白了......两个问题合二为一。通常在这里皱眉......事实上,你的第二部分对我来说毫无意义。请阅读常见问题解答中的如何提问部分,并至少用输入和预期输出列表来表述这个问题。
【解决方案2】:

首先,让我们获取每件商品的总金额:

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 中记录的存在/不存在创建一个人工列,并按该人工列进行分组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2018-04-26
    相关资源
    最近更新 更多