我们有一个数据库,用于存储每月员工的值(例如兼职百分比):
+-----+------+-------+----------+
| emp | year | month | parttime |
+-----+------+-------+----------+
| 1 | 2015 | 1 | 100 |
| 1 | 2015 | 2 | 100 |
| 1 | 2015 | 3 | 100 |
| 1 | 2015 | 4 | 100 |
| 2 | 2015 | 1 | 80 |
| 2 | 2015 | 2 | 100 |
| 2 | 2015 | 3 | 100 |
| 2 | 2015 | 4 | 80 |
| 3 | 2015 | 1 | 60 |
| 3 | 2015 | 2 | 60 |
| 3 | 2015 | 3 | 80 |
| 3 | 2015 | 4 | 100 |
+-----+------+-------+----------+
出于报告目的,我需要以“开始/结束”形式显示值:
+-----+---------+---------+----------+
| emp | from | to | parttime |
+-----+---------+---------+----------+
| 1 | 2015.01 | 2015.04 | 100 |
| 2 | 2015.01 | 2015.01 | 80 |
| 2 | 2015.02 | 2015.03 | 100 |
| 2 | 2015.04 | 2015.04 | 80 |
| 3 | 2015.01 | 2015.02 | 60 |
| 3 | 2015.03 | 2015.03 | 80 |
| 3 | 2015.04 | 2015.04 | 100 |
+-----+---------+---------+----------+
我的第一次尝试是用简单的最小/最大方法来解决它。但员工编号。 2 对于循环值 80 来说有点棘手。
有什么想法/例子吗?数据库基于db/2或microsoft。
谢谢
菲利普
最佳答案
这称为间隙和岛屿问题。一种快速解决方案:
DECLARE @Employee TABLE
(emp int, year int, month int, parttime int)
INSERT INTO @Employee
VALUES
(1, 2015, 1, 100),
(1, 2015, 2, 100),
(1, 2015, 3, 100),
(1, 2015, 4, 100),
(2, 2015, 1, 80),
(2, 2015, 2, 100),
(2, 2015, 3, 100),
(2, 2015, 4, 80),
(3, 2015, 1, 60),
(3, 2015, 2, 60),
(3, 2015, 3, 80),
(3, 2015, 4, 100)
;WITH cte
AS
(
SELECT *
,e.[month] - ROW_NUMBER() OVER (ORDER BY e.emp, e.[parttime]) AS Grp
FROM @Employee e
)
SELECT
emp,
CAST([year] AS varchar(50)) + '.' + CAST(MIN([month])AS varchar(50)) AS [from],
CAST([year] AS varchar(50)) + '.' + CAST(MAX([month])AS varchar(50)) AS [to],
parttime
FROM cte
GROUP BY emp, parttime, year, Grp
ORDER BY emp, [from]
关于sql从 "record per month"转换为 "record from/until",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29891766/