当StartDate是固定日期时,如何为StartDate到EndDate的列赋值,例如2013年1月

时间:2013-05-14 17:50:01

标签: sql sql-server-2008 tsql

我有这样的表:

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个列:StartDate,StartMate来自StartDate和EndYear,EndMon来自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到最大月份。在我的表格中,我将列出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是Feb- 2013年,EndDate为2013年7月,工作量= 35,2013年1月将分配0值,从2013年2月至2015年7月将分配值35。 在结束日期之后指定0到最大结束日期。

我将感激你的帮助!

1 个答案:

答案 0 :(得分: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都支持YEARMONTH函数,因此以下查询(尽管它使每个CASE比原始的MySQL唯一函数更长)应该适用于任一数据库:< / p>

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