sql从 "record per month"转换为 "record from/until"

标签 sql sql-server t-sql db2

我们有一个数据库,用于存储每月员工的值(例如兼职百分比):

+-----+------+-------+----------+
| 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/

相关文章:

c# - SqlCommand 选择具有特定值的所有列

SQL 限制 "WHERE X IN (...)"

sql - SQL Server 中的多个单独的 IF 条件

mysql - 额外的反斜杠\当 SELECT ... INTO OUTFILE ... 在 MySQL

带参数的 SQL 插入适用于 MSAccess,但不适用于 SQL Server

sql-server - 为什么用户定义的表类型的默认值不会保留在数据库中?

sql - 改进 SQL DateTime 的工作

sql - 将数据插入到 tSQLt faketable 的最佳方式?

sql - 如何有效地订购预先加载的记录?

sql-server - ROW_NUMBER OVER(按日期_列排序)