在SQL Server 2005中创建复杂的视图

时间:2012-03-30 07:59:05

标签: sql sql-server sql-server-2005

我有一个看起来像这样的表:

Name     Job        Year    ImpFile   ImpDate
------------------------------------------------
John     Clerk      1986    Imp01     20.01.2012
James    Assistant  1990    Imp01     20.01.2012
Anna     Manager    1982    Imp02     26.02.2012
Sam      Salesman   1985    Imp02     26.02.2012
Dean     Cleaner    1985    Imp02     26.02.2012

我需要创建一个看起来像这样的视图:

Name   ImpFile/Job         Year
--------------------------------
       Imp01 20.01.2012
John   Clerk               1986
James  Assistant           1990
       Imp02 26.02.2012
Anna   Manager             1982
Sam    Salesman            1985
Dean   Cleaner             1985

是否有可能在Microsoft SQL Server 2005中执行此类操作?如果是,那我该怎么办?

2 个答案:

答案 0 :(得分:1)

不使用视图:

create table test(
name varchar(10),
Job varchar(20),
year smallint,
ImpFile varchar(10),
ImpDate datetime)

insert into Test
values('John', 'Clerk', 1986, 'Imp01', '20.01.2012')

insert into Test
values('James', 'Assistant', 1990, 'Imp01', '20.01.2012')

insert into Test
values('Anna', 'Manager', 1982, 'Imp02', '26.02.2012')

insert into Test
values('Sam', 'Salesmas', 1985, 'Imp02', '26.02.2012')


--drop table test

select * from
(
select name,Job,ImpFile,year from test
group by name, Job, ImpFile, year
union all
select distinct null, null, ImpFile + ' ' + convert(nvarchar, ImpDate, 104), null from test
) tablePlusHeaders
order by left(ImpFile,5), name, year

答案 1 :(得分:0)

嗯,这绝对是可能的,但你必须要么使用存储过程,要么使用一些技巧。使用存储过程会更直接,因为您可以使用游标简单地循环记录(尽管这取决于记录的数量,这可能会对性能产生负面影响)。

你可能可以将表格加入到自身中并以某种方式使用案例陈述...如果你喜欢解决谜题并且不急于:)

或者我也听说过你可以用CTE进行递归查询。您可以将两个查询组合在一起(一个选择ImpFile,另一个选择作业记录)并使用递归CTE以某种方式实现此目的。

它绝对必须是一个视图吗?您是否至少可以使用存储过程来创建临时表?我个人会用C#(或您选择的语言)处理这种格式。