0

我有这样的表:

Country Project InvCode InvName  Site  WorkLoad    StartDate   EndDate
USA 1234    2020    Jane Box      101    20       2012-02-10  2013-04-15
USA 1234    2020    Jane Box      102    35       2013-02-10  2013-07-15
USA 2222    2140    James Smith 101 5   2012-10-10  2013-12-05
USA 2222    2590    Susan Falco 410 12  2013-05-10  2015-12-20
USA 2250    2140    James Smith 401 8   2013-04-01  2013-07-18

我在表中添加了 4 列:StartYear、StartMonth 来自 StartDate 和 EndYear、EndMonth 来自 EndDate(希望它们有助于编写查询)

StartYear   StartMonth EndYear  EndMonth
2012    2     2013   5
2013    2     2013   7
2012    10    2013   12
2013    5     2015   12
2013    4     2013   7

所需的输出将如下所示。我无法适应所有月份,但它应该从 EndDate 开始达到最大 Month-Year。在我的表中,我将列从 2013 年 1 月到 2015 年 12 月

country|Project|InvCode|INvName|Site|StartDate|EndDate|Jan-13|Feb-13|Mar-13|Apr-13|May-13|.

USA|1234|2020|Jane Box   |101|2012-02-10|2013-05-15|     20 20    20        20     0
USA|1234|   2020|Jane Box   |102|2013-02-10|2013-07-15|     0      35    35     35    35
USA|2222|2140|James Smith|101|2012-10-10|2013-12-05|     5  5      5      5     5
USA|2222|   2590|Susan Falco|410|2013-05-10|2015-12-20|     0   0      0         0   12
USA|2250|2140|James Smith|401|2013-04-01|2013-07-18|      0 0      0      8   8

如果 StartDate 在 2013 年 1 月之前,则从 2013 年 1 月开始并分配相同的值,例如,在 EndDate 之后分配 0 到最大 EndDate 到 EndDate 的每个月为 20。

当 StartDate 在 2013 年 1 月之后,为 StartDate 的前一个月分配 0 并从与 StartDate 中的月份相等的月份开始,为每个月分配相同的值,直到 EndDate,例如,StartDate 是 2013 年 2 月,EndDate是 2013 年 7 月,工作量 = 35,对于 2013 年 1 月的值将被分配 0,从 2013 年 2 月到 2015 年 7 月的值将被分配 35。在结束日期之后分配 0 到最大结束日期。

我会感谢你的帮助!

4

1 回答 1

3

这是一个开始;您需要填写剩余月份的列:

-- MySQL
SELECT
  Country,
  Project,
  InvCode,
  InvName,
  Site,
  StartDate,
  EndDate,
  CASE WHEN 201301 BETWEEN DATE_FORMAT(StartDate, '%Y%m') AND DATE_FORMAT(EndDate, '%Y%m')
     THEN WorkLoad
     ELSE 0 END 'Jan-13',
  CASE WHEN 201302 BETWEEN DATE_FORMAT(StartDate, '%Y%m') AND DATE_FORMAT(EndDate, '%Y%m')
     THEN WorkLoad
     ELSE 0 END 'Feb-13',
... and so on through December
FROM my_table
ORDER BY whatever

附录我用当时的标签(MySQL)回答了这个问题,但后来注意到标题是“SQL Server 2008”(后来被移到标签上)。

在 SQL Server 2008 中,上面的“截断”日期会有所不同,但其余的都应该相同。因为 MySQL 和 SQL Server 都支持YEARandMONTH函数,所以下面的查询虽然CASE比原来的 MySQL 版本更长,但应该适用于任一数据库:

-- SQL Server AND MySQL
SELECT
  Country,
  Project,
  InvCode,
  InvName,
  Site,
  StartDate,
  EndDate,
  CASE WHEN 201301 BETWEEN YEAR(StartDate)*100 + MONTH(StartDate) AND YEAR(EndDate)*100 + Month(EndDate)
     THEN WorkLoad
     ELSE 0 END 'Jan-13',
  CASE WHEN 201302 BETWEEN YEAR(StartDate)*100 + MONTH(StartDate) AND YEAR(EndDate)*100 + Month(EndDate)
     THEN WorkLoad
     ELSE 0 END 'Feb-13',
... and so on through December
FROM my_table
ORDER BY whatever
于 2013-05-14T18:06:36.277 回答