2012-04-23 36 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