2012-04-23 39 views
0

我正在做一个关于我公司桌面和当前安装的软件程序的报告。如何在单行列中显示信息一次,但是继续在同一结果集中的多行列中显示信息?

例如,假设我们有一个保证每台机器只返回一行三列:Location, Last_logged-on_User, Machine_Name而这将返回一个或多个行:Software。我希望第一行显示所有单行列以及软件列的第一行,其余行只显示软件行并用空白填充单行列。

Location Last_logged-on_User Machine_Name Software_name 
Venus James.Jiao   McKain  Internet Explorer 
              Firefox 
              Antivirus X 
              Office Suite 
Mars  Veronica.Mars  Obama  Internet Explorer 
              Google Chrome 
              Adobe Acrobat 
Jupiter Taylor.Swift  Bachmann  Opera 
              Speech Helper 
              Dictionary for Kids 

我要找的查询,但我不太清楚如何开始这个,因为我想不出办法有条件空白一些行单排列。

下面是表的结构,如果你需要它

Create table Machine 
(
    machine_id int not null, 
    machine_name varchar(25) not null, 
    last_logged-on_user varchar(25) not null, 
    location varchar(25) not null 
) 

Create table SoftwareList 
( 
    machine_id int not null, 
    software_name varchar(25) not null 
) 
+0

我已经包含了表格结构 – deutschZuid 2012-04-23 22:03:52

回答

4

你可以使用Row_Number() Over (Partition by,以确定它是否是在一个子查询中第一次出现,然后用一个case语句只返回位置,当行数为1.

SELECT 
    CASE WHEN RowNo = 1 OR RowNo IS NULL THEN location ELSE '' END as Location, 
    Software_name 

FROM (
    SELECT 
     sl.Software_name , 
     m.location, 
     ROW_NUMBER() OVER(Partition by location ORDER by location) as rowNo 
    FROM Machine m 
    LEFT JOIN Softwarelist sl 
    ON sl.Machine_id = m.machine_id 


) d 

请参阅SQL小提琴here

希望帮助

+0

这个工程就像一个魅力。我怀疑row_number()会以某种方式参与进来,但是没有超越那个精神的敏锐度! – deutschZuid 2012-04-23 23:00:30