如何建立月度表

时间:2016-01-14 15:26:34

标签: sql sql-server select

我有一张这样的表:

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”字段构建的。

规则:

  1. 如果开始日期类似“2015年4月17日”,则开始使用 第4个月的数据。
  2. 如果最终数据类似于“2015年1月5日” 第5个月的数据。您可以查看输出以了解我的输入方式 手动处理来自Changes_table的数据。
  3. 我案例:01/01 / 2015-15 / 03/2015和16/03 / 2015-30 / 04/2015 然后在1/1 / 2015-15 / 03/2015然后将数据拉到1,2,3,将另一个拉到第4个月。 我非常希望您能够以简单而正确的方式指导您。 谢谢。

1 个答案:

答案 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))