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
)
4

1 回答 1

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

希望有帮助

于 2012-04-23T22:11:06.300 回答