【问题标题】:how to find percentage without calculating manually?如何在不手动计算的情况下找到百分比?
【发布时间】:2013-11-18 16:31:00
【问题描述】:

感谢您的关注。我是 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     | ?
...

【问题讨论】:

  • 在 SQL 术语中“使用 while 循环”与“为每个循环手动执行”是一回事。 为每个手动执行的方法是在单个查询中执行所有操作。

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


【解决方案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子句。

【讨论】:

    【解决方案2】:

    将此列添加到查询中

    Expenses * 200.0 / SUM(expenses) over (partition by company_name) as PercentageExepenses

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

    【讨论】:

      【解决方案3】:

      如果您自行加入并因此将每家公司的总数放在单独的列中,您可以计算百分比。那么公司总数有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)
      

      【讨论】:

        【解决方案4】:

        编辑: 您实际上是否将公司总数存储在数据库中?如果,那么这应该适用于 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 已关闭,或者我会链接到那里的完整示例)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-21
          • 1970-01-01
          • 2021-04-12
          • 2022-08-06
          • 2015-01-31
          • 2012-07-13
          • 2022-01-20
          相关资源
          最近更新 更多