我有这样的表:
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到最大结束日期。
我将感激你的帮助!
答案 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都支持YEAR
和MONTH
函数,因此以下查询(尽管它使每个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