【问题标题】:Summarizing values where a summed column is exceeded within a date range汇总某个日期范围内超过求和列的值
【发布时间】:2021-07-26 07:02:21
【问题描述】:

我有一个表,其中包含与员工相关的职位数据。一名员工可能有多个在职职位,并且可以通过设置适用的百分比来定义拆分。职位有开始日期和结束日期。默认结束日期为 2099,这意味着尚未指定结束日期(正在进行中)。

数据是通过 ERP 系统输入的,在给定的日期范围内有可能超过 100%。

我想构建一个查询来总结每家公司中有多少员工的职位百分比分配超过 100%。仅适用于在职员工。

我在 Fiddle 中汇总了一些示例数据来说明这一点 - http://sqlfiddle.com/#!18/0e36d9

编辑:这是一些示例数据:

status company EmpId PositionCode PositionPerc Date_From Date_To
ACTIVE EN 1234 001 100 2012-06-12T00:00:00Z 2021-01-12T00:00:00Z
ACTIVE EN 1234 002 100 2021-01-13T00:00:00Z 2099-12-31T00:00:00Z
ACTIVE EN 4321 001 80 2019-06-17T00:00:00Z 2099-12-31T00:00:00Z
ACTIVE EN 4321 003 30 2021-03-10T00:00:00Z 2099-12-31T00:00:00Z
ACTIVE EN 7811 002 100 2019-06-17T00:00:00Z 2020-11-12T00:00:00Z
ACTIVE NO 2234 002 50 2019-06-17T00:00:00Z 2099-12-31T00:00:00Z
ACTIVE NO 2234 005 50 2020-02-21T00:00:00Z 2099-12-31T00:00:00Z
ACTIVE GB 4121 001 100 2021-01-17T00:00:00Z 2099-12-31T00:00:00Z
ACTIVE GB 4121 006 100 2021-04-17T00:00:00Z 2099-12-31T00:00:00Z
ACTIVE EN 5551 001 50 2015-06-17T00:00:00Z 2099-12-31T00:00:00Z
ACTIVE EN 5551 003 60 2021-03-10T00:00:00Z 2099-12-31T00:00:00Z

我正在尝试像这样取回数据:

Company Emps_that_exceed
EN 2
NO 0
GB 1

我非常感谢任何帮助。 我试图对此进行搜索,但我很难准确地描述它以获取任何有用的信息。

我知道这将是类似的东西

select client, SUM(select....) from positiondata group by client

我以前没有做过这样的查询。

【问题讨论】:

  • 请确保您的问题是独立的,即包含小提琴的内容,以防小提琴出现故障。根据问题指南,请展示您尝试过的内容,并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server tsql


【解决方案1】:

我们的想法是对数据进行反透视,以便您可以进行累积求和。在“至”日期后的第二天,减去 positionperc 的金额。

然后,只需按公司汇总即可得到超额员工总数:

with ced as (
      select pd.company, pd.empid, v.date, sum(v.positionperc) as positionperc,
             sum(sum(v.positionperc)) over (partition by pd.company, pd.empid order by v.date) as total_positionperc
      from positiondata pd cross apply
           (values (pd.date_from, pd.positionperc),
                   (dateadd(day, 1, pd.date_to), - pd.positionperc)
           ) v(date, positionperc)
      group by pd.company, pd.empid, date
     )
select company,
       count(distinct case when total_positionperc > 100 then empid end)
from ced
group by company;

Here 是一个 dbfiddle。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2019-02-08
    • 2018-12-29
    相关资源
    最近更新 更多