【问题标题】:Creating a complicated view in SQL server 2005在 SQL Server 2005 中创建复杂视图
【发布时间】:2012-03-30 18:01:30
【问题描述】:

我有一张如下所示的表格:

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 中执行类似的操作?如果是,那我该怎么做?

【问题讨论】:

  • 这个链接可能对stackoverflow.com/questions/235515/…有帮助
  • 我认为您只需要按 ImpDate 和 ImpFile 排序的列 'Name'、'Job'、'Year' 和 'ImpFile/Job' 的结果集。在这种情况下,选择将非常简单。
  • 最好在报告工具中进行这种类型的重新格式化。您试图强制两种不同类型的数据占据结果集中的同一列 - 这不是 SQL 方式。而且,正如@jbl 指出的那样,您也不能保证从视图返回的行的顺序。

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


【解决方案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

【讨论】:

    【解决方案2】:

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

    您可能可以将表格连接到自身并以某种方式使用案例语句...如果您喜欢解决难题并且不着急:)

    或者我还听说您可以使用 CTE 进行递归查询。您也许可以将两个查询合并在一起(一个选择 ImpFile,另一个选择作业记录)并使用递归 CTE 以某种方式完成此操作。

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

    【讨论】:

    • 您不需要使用视图。只需从子查询中选择:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多