sql - 如何为每个员工总结 6 个月范围内 5 年的数据?
问题描述
我是 SQL 编程新手,需要您的帮助。我需要编写一个 sql 查询,从他加入公司的那一天开始,为每个员工每 6 个月和 5 年之前的累计金额求和。
我的表如下所示
Employee StartDate DealDate Amount
1 10/01/2017 11/01/2017 10000 --Starting month
1 10/01/2017 11/02/2017 15000 --within first 6 month of joining
1 10/01/2017 11/07/2017 20000 --6-12 months
1 10/01/2017 11/01/2018 30000 --12-18 months
1 10/01/2017 11/02/2018 40000 --12-18 months
1 10/01/2017 11/07/2018 50000 --18-24 months
1 10/01/2017 11/01/2019 60000 --24-30 months
1 10/01/2017 11/08/2019 70000 --30-36 months
1 10/01/2017 11/01/2020 80000 --36-42 months
1 10/01/2017 11/07/2020 90000 --42-48 months
2 20/01/2017 11/01/2017 10000 --so on for employee 2
2 20/01/2017 11/02/2017 25000
2 20/01/2017 11/07/2017 40000
2 20/01/2017 11/01/2018 30000
2 20/01/2017 11/02/2018 40000
2 20/01/2017 11/07/2018 50000
2 20/01/2017 11/01/2019 60000
2 20/01/2017 11/08/2019 70000
2 20/01/2017 11/01/2020 80000
and my expected outcome is
Employee StartDate [0-6month] [6-12month] [1 year] [12-18 month] [18-24 month] [2 year]
1 10/01/2017 25000 20000 45000 70000 50000 165000
2 20/01/2017 35000 40000 75000 70000 50000 195000
我尝试了以下
DECLARE @range1start DATE = @date
DECLARE @range1end DATE = (SELECT DATEADD(m,6,@range1start))
DECLARE @range2start DATE = @range1end
DECLARE @range2end DATE = (SELECT DATEADD(m,6,@range2start))
DECLARE @range3start DATE = @range2end
DECLARE @range3end DATE = (SELECT DATEADD(m,12,@range3start)) '
然后对每个范围使用 case 条件。我想知道是否有更好的方法来实现这个而不使用这么多变量和循环。任何帮助表示赞赏。
提前致谢!
解决方案
您可以使用条件聚合 - 尽管键入有点冗长:
select
employee,
min(startdate) startdate,
sum(case when dealdate < dateadd(month, 6, startdate) then amount end) [0-6 month],
sum(case when dealdate >= dateadd(month, 6, startdate) and dealdate < dateadd(month, 12, startdate) then amount end) [6-12 month],
sum(case when dealdate < dateadd(month, 12, startdate) then amount end) [1 year],
sum(case when dealdate >= dateadd(month, 12, startdate) and dealdate < dateadd(month, 18, startdate) then amount end) [12-18 month],
sum(case when dealdate >= dateadd(month, 18, startdate) and dealdate < dateadd(month, 24, startdate) then amount end) [18-24 month],
sum(case when dealdate >= dateadd(month, 12, startdate) and dealdate < dateadd(month, 24, startdate) then amount end) [2 year]
from mytable
group by employee
推荐阅读
- python - PyTesseract 抛出 pytesseract.pytesseract.TesseractNotFoundError 即使安装了 tesseract 并且在路径上
- android - 如何在 ScrollView + 相对布局中使 TextView 靠近 EditText
- ffmpeg - 如何使用ffmpeg记录不连续的rtsp流?
- spring - 在 kotlin 中访问 Spring 托管类之外的 Spring 托管 bean
- java - 如何找到每行代码的执行时间?
- python - 为什么while循环无法中断?
- javascript - TypeError:每次我重新加载网页时都无法读取未定义的属性“1”
- c++ - 重载 C 字符串的函数模板
- javascript - Angular 8 RangeError:超出最大调用堆栈大小
- c++ - C++ 如何修改代码以在仅编译范围为 0x00 到 0x7F 的代码中从 0x00 到 0xFF 范围内的串行端口发送字节