感谢您的关注。我是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 | ?
...
答案 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已关闭,或者我将链接到那里的完整示例)