如何在不手动计算的情况下找到百分

时间:2013-11-18 16:31:00

标签: sql sql-server sql-server-2008 tsql plsql

感谢您的关注。我是tsql的新手,不知道如何继续。我有一个包含10个不同公司的表,每个公司有20个部门(所有公司的部门都相同)。 我正在尝试计算每个部门的费用百分比,并希望在结果中显示额外的列“百分比”。

请注意,对于每个公司,第一个部门是总计费用,这只是公司所有部门合计的总费用,不需要计算,并且应该从下一行计算。

是否可以通过使用while循环或任何其他方式来执行此操作,而不是手动为每个方式执行此操作?

ID  |Company_name| Department        |Expenses  | Percentage

1   |Company1    |TotalComp1Expenses |50000     | -
2   |Company1    |Department1        |4000      | ?
3   |Company1    |Department2        |8000      | ?
4   |Company1    |Department3        |8000      | ?
5   |Company1    |Department4        |7000      | ?
6   |Company1    |Department5        |10000     | ?
...
11  |Company2    |TotalComp2Expenses |100000    | -
12  |Company2    |Department1        |6000      | ?
13  |Company2    |Department2        |5000      | ?
15  |Company2    |Department3        |8000      | ?
15  |Company2    |Department4        |7000      | ?
16  |Company2    |Department5        |10000     | ?
...
21 |Company3    |TotalComp3Expenses  |70000     | -
22 |Company3    |Department1         |2000      | ?
23 |Company3    |Department2         |7000      | ?
24 |Company3    |Department3         |9000      | ?
25 |Company3    |Department4         |8000      | ?
26 |Company3    |Department5         |10000     | ?
...

4 个答案:

答案 0 :(得分:1)

我认为最明智的方法是使用窗口函数。如果您希望基于Total%列的百分比,则可以执行以下操作:

select ID, Company_name, Department, Expenses,
       (100.0* Expenses /
        max(case when Department like 'Total%Expenses' then Expenses end) over
            (partition by Company_Name)
       ) as Percentage
from t;

您也可以将此作为非总费用的总和:

select ID, Company_name, Department, Expenses,
       (100.0* Expenses /
        max(case when Department not like 'Total%Expenses' then Expenses end) over
            (partition by Company_Name)
       ) as Percentage
from t;

窗口函数就像聚合函数,但没有聚合。每个组的总和将作为每行的附加列添加。分组的定义基于partition by子句。

答案 1 :(得分:0)

将此列添加到查询

费用* 200.0 / SUM(费用)超过(按公司名称分区)为PercentageExepenses

您必须将费用乘以200.0才能考虑到您已经拥有该公司的总数,因此需要重复计算。

答案 2 :(得分:0)

如果您自行加入并因此将每个公司的总数放在一个单独的列中,则可以计算百分比。公司总数有100%,我认为是正确的

select 
  id
, company_name
, department
, expenses
, expenses/total*100 as percentage
from table_expenses tbx
inner join
(select 
   company_name
 , sum(expenses/2) as expenses 
 from table_expenses 
 group by
  company_name
) sums
on
(tbx.company_name = sums.company_name)

答案 3 :(得分:0)

编辑: 您是否实际将公司总数存储在数据库中?如果,那么这应该适用于CTE:

select
    compname,
    expense as CompExp
    from
    <YourTable>
    where
    Department like 'Total%'

但我不知道你为什么要存储这样的小计。


以“表格”为例:

;with CompTotal as (
select
compname,
sum(expenses) as CompExp
from
<YourTable>
group by CompName)

select
C.CompName,
Department,
CompTotal.CompExp,
sum(Expenses)as DeptEexpense,
(sum(Expenses) / (CompTotal.CompExp * 1.0)) * 100 as Pct
from
<YourTable> C
inner join
CompTotal
on C.CompName = CompTotal.CompName
group by
C.CompName,
Department,
CompTotal.CompExp

CTE按公司给出了总数。然后我们将其加入公司名称的原始表格,并按部门总计。然后只是常规数学给我们每个部门的百分比。 (SQLFiddle已关闭,或者我将链接到那里的完整示例)