将记录分成多个日历年范围的记录

时间:2015-01-20 17:15:09

标签: sql-server view

我有一个表,我需要使用ZIP列连接到另一个表来创建视图

--table 1
CREATE TABLE [dbo].[ZIP](
[ZIP] [varchar](5) NOT NULL,
[BEG] [datetime] NOT NULL,
[END] [datetime] NOT NULL,
CONSTRAINT [PK_ZIP] PRIMARY KEY CLUSTERED 
(
[ZIP] ASC,
[BEG] ASC
)) ON [PRIMARY]

insert into ZIP select '64112', '01/01/2012', '12/31/2045'
insert into ZIP select '64113', '01/01/2012', '12/31/2045'
insert into ZIP select '64114', '01/01/2012', '12/31/2045'

--table 2
CREATE TABLE [dbo].[ZIPCODE](
[ZIP] [varchar](5) NOT NULL,
[STATUS] [varchar](12) NULL,
CONSTRAINT [PK_ZIPCODE] PRIMARY KEY CLUSTERED 
(
[ZIP] ASC
)) ON [PRIMARY]



insert into ZIP select '64112', 'BMMNNNNNNNNN'
insert into ZIP select '64113', 'BMNNNNNNNNNB'
insert into ZIP select '64114', 'BMPNNNNNNNNP'

表1记录遍历多年,所以我想将其分解为日历年度范围,如下所示,如果今天的日期在特定日期范围内,则结束日期应为'12 / 31/2045'

'64112', '01/01/2012', '12/31/2012'
'64112', '01/01/2013', '12/31/2013'
'64112', '01/01/2014', '12/31/2014'
'64112', '01/01/2015', '12/31/2045'

表2 STATUS列'NNNNNNNNNNNN'

表2 STATUS列的设置方式是每个位置都引用一个CY。第一个位置是2004年,第二个是2005年,第三个是2006年,所以.......,第十二个是2015年的上述字符串,每个位置可以有4个值中的一个N,B,P或M

我想创建的视图需要提取如下所示的记录

'64112', '01/01/2012', '12/31/2012', N
'64112', '01/01/2013', '12/31/2013', N
'64112', '01/01/2014', '12/31/2014', N
'64112', '01/01/2015', '12/31/2045', N

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

哇,这是我在数据库中见过的最丑陋的东西之一。

所以我唯一能想到的就是为每个邮编/年组合一行,并将状态分成两部分,如下所示:

select
zip,
cast('2012-01-01' as date) as TheYear,
substring(status,10,1) as Status
from
zipcode
UNION
select
zip,
cast('2013-01-01' as date) as TheYear,
substring(status,11,1) as Status
from
zipcode

然后你可以加入你的ZIP表格。这是example in SQLFiddle。我相信我多年来都没有获得正确的职位,而且我确实这些年来都没有做过,但我认为这应该让你顺利。