根据sqlserver中的start和enddate填写月份列中的值

时间:2017-03-09 13:45:45

标签: sql sql-server

我有如下表格,

startdate    ||enddate   ||price|| jan|| feb|| mar

2015-12-23   2017-01-31    223.3

2015-01-01   2017-03-31     1.9

2017-02-03   2017-03-23     5.99

2017-02-01   2017-02-23     233

我必须根据开始日期和结束日期在“价格”列中填写相同值的月份列(jan,feb,mar)。

例如。如果当前月份= jan 当前年份= 2017

1)年(startdate)= 2015,月(endate)= jan 然后仅在[jan]列中填写价格值,而不是在其他列中

2)年(startdate)= 2015,月(enddate)= mar 然后在[jan],[feb],[mar]

中填写价格值

例如。当前月份= 2月份 当前年份= 2017

1)年(startdate)= 2017年,如果月份(startdate)= feb和month(endaate)= mar 然后单独填写[feb]和[mar],而不是[jan]

2)年(startdate)= 2017,月(startdate)= feb,month(endate)= feb 仅填写[feb]

2 个答案:

答案 0 :(得分:1)

对每个月的列使用CASE表达式:

SELECT StartDate, EndDate, Price, 
 CASE WHEN {some condition = true} THEN Price ELSE NULL END AS Jan,
 CASE WHEN {some condition = true} THEN Price ELSE NULL END AS Feb,
 CASE WHEN {some condition = true} THEN Price ELSE NULL END AS Mar,
 ...etc...

答案 1 :(得分:1)

可以这样做:

UPDATE
    table_Name
SET 
  jan = CASE WHEN DATEPART(yyyy, startdate) = DATEPART(yyyy, enddate) 
                  AND 
                  DATEPART(mm, startdate) <= 01  AND DATEPART(mm, endate) >= 01 
             THEN `price` 
             WHEN DATEPART(yyyy, startdate) != DATEPART(yyyy, enddate)
                  AND
                  DATEPART(mm, enddate) >= 01
             THEN `price`
             ELSE NULL END,
  feb = CASE WHEN DATEPART(yyyy, startdate) = DATEPART(yyyy, enddate) 
                  AND 
                  DATEPART(mm, startdate) <= 02  AND DATEPART(mm, endate) >= 02
             THEN `price` 
             WHEN DATEPART(yyyy, startdate) != DATEPART(yyyy, enddate)
                  AND
                  DATEPART(mm, enddate) >= 02
             THEN `price`
             ELSE NULL END;

我只编写前两个月的代码,你可以通过用月号代替查询中的数字来完成其余的工作。