使用SQL从日期范围拆分/透视数据

时间:2014-02-05 05:40:09

标签: sql sql-server pivot

嗨,关于分割/枢轴日期的问题,我有一个问题

这是我的查询

select Name
     , Start
     , End 
  from Employees 
 where Start >= '1/27/2014' 
   and End <= '1/31/2014'

样本数据就像这样

enter image description here

我想要做的是按照日期范围分割/转动所有数据,如此

enter image description here


但我不知道我怎么能这样做,如果可能的话?
谢谢。

2 个答案:

答案 0 :(得分:0)

首先,将表格创建为 -

USE `Test`;
CREATE  TABLE `test`.`Tbl_Sample_Data` (
  `Name` VARCHAR(50) NULL ,    
  `Start` DATETIME NULL ,
  `End` DATETIME NULL );

使用 -

插入行
INSERT INTO `test`.`tbl_sample_data`
(`End`,
`Name`,
`Start`)
VALUES
(
'PutEndDateHere',
'PutNameHere',
'PutStartDateHere'
);

此处,日期应为yyyy-MM-dd格式,否则会收到错误1292.

使用此查询获得您想要的内容。

SELECT `Name`,'Start' AS colName, `Start` AS value FROM test.tbl_sample_data
UNION ALL
SELECT `Name`,'End' AS colName, `End` AS value FROM test.tbl_sample_data
ORDER BY `Name` ASC

请注意,名称与关键字相同的列名必须包含在反引号中。例如。示例名称。否则,你会收到错误。

答案 1 :(得分:0)

您需要生成所有日期。我在这里使用cte做到了这一点。然后我将这个日期范围与您的数据一起加入并获得所需的结果。

with DateRange AS
(
    SELECT CAST('1/27/2014' as DATEtime) DateValue
     UNION ALL
    SELECT dateadd(dd,1,DateValue)
      FROM DateRange
     WHERE dateadd(dd,1,DateValue) <= CAST('3/31/2014' as datetime)
)
select name
     , DateValue
  from Employees
  join DateRange
    on start <= DateValue
   and [end] >= datevalue
 order by 
       name
     , DateValue

<小时/> 在您更新的问题后过时 我会用简单的联盟来解决这个问题:

select Name
     , Start
  from Employees 
 where Start >= '1/27/2014' 
   and End <= '1/31/2014'
 union all
select Name
     , End
  from Employees 
 where Start >= '1/27/2014' 
   and End <= '1/31/2014'
 order by
       Name