如何在单行列中显示一次信息,但是继续在同一结果集的多行列中显示信息?

时间:2012-04-23 21:57:14

标签: tsql sql-server-2005

我正在报告我公司的桌面以及当前安装在其上的软件程序。

例如,假设我们有三列保证每台机器只返回一行:Location, Last_logged-on_User, Machine_Name和一行将返回一行或多行:Software。我希望第一行显示所有单行列以及Software列的第一行,其余行仅显示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
)

1 个答案:

答案 0 :(得分: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 Fiddle here

希望有所帮助