我有一张这样的表:
Changes_table:
ID StartDate EndDate RC GC ESG SF CC
12345 17/12/1972 30/09/1984 3 1 X1 B2 NULL
12345 01/01/1996 30/11/2007 3 1 X1 B2 R1
12345 01/12/2008 10/03/2015 3 1 X1 B2 R1
12345 01/05/2015 15/06/2015 3 6 O1 B2 NULL
12345 01/08/2015 31/12/9999 2 6 Q2 B1 NULL
我想建一个月(8个月)的2015年这样的表:
ID Month Year RC GC ESG SF CC
12345 1 2015 3 1 X1 B2 R1
12345 2 2015 3 1 X1 B2 R1
12345 3 2015 3 1 X1 B2 R1
12345 4 2015 NULL NULL NULL NULL NULL
12345 5 2015 3 6 O1 B2 NULL
12345 6 2015 3 6 O1 B2 NULL
12345 7 2015 NULL NULL NULL NULL NULL
12345 8 2015 2 6 Q2 B1 NULL
但是有这样的情况:
ID StartDate EndDate RC GC ESG SF CC
11111 17/12/1972 30/09/1984 3 1 X1 B2 NULL
11111 01/10/1984 30/01/1992 3 1 X1 B2 R1
在这种情况下,我想向这名员工提供我对他的最后一行详细信息。输出:
ID Month Year RC GC ESG SF CC
11111 1 2015 3 1 Z1 B2 R1
11111 2 2015 3 1 Z1 B2 R1
11111 3 2015 3 1 Z1 B2 R1
11111 4 2015 3 1 Z1 B2 R1
11111 5 2015 3 1 Z1 B2 R1
11111 6 2015 3 1 Z1 B2 R1
11111 7 2015 3 1 Z1 B2 R1
11111 8 2015 3 1 Z1 B2 R1
意思是,虽然结束日期已经过去,因为没有为该员工记录的其他详细信息,我想为他保留最后的详细信息。知道如何在语法中区分两者吗?
该表是根据“StartDate”和“EndDate”字段构建的。
规则:
我案例:01/01 / 2015-15 / 03/2015和16/03 / 2015-30 / 04/2015 然后在1/1 / 2015-15 / 03/2015然后将数据拉到1,2,3,将另一个拉到第4个月。 我非常希望您能够以简单而正确的方式指导您。 谢谢。
答案 0 :(得分:0)
我明白你要做什么。我会尝试类似下面的内容。我没有方便的sqlserver,所以无法检查语法,但你可以进行调试:
SELECT Changes_Table.id, AllMonths.Month, 2015, Changes_Table.RC,
Changes_Table.GC, Changes_Table.ESG, Changes_Table.SF, Changes_Table.CC
FROM Changes_Table
RIGHT JOIN (VALUES (1), (2), (3), (4), (5), (6), (7), (8))
AS AllMonths(Month)
ON ((year(Changes_Table.StartDate) < 2015) or
(year(Changes_Table.StartDate) = 2015 and
month(Changes_Table.StartDate) <= AllMonths.Month)) and
((year(Changes_Table.EndDate) > 2015) or
(year(Changes_Table.EndDate) = 2015 and
month(Changes_Table.EndDate) >= AllMonths.Month))