0

会社のデスクトップと、現在インストールされているソフトウェア プログラムに関するレポートを作成しています。

たとえば、マシンごとに 1 つの行のみを返すことが保証されている 3 つの列とLocation, Last_logged-on_User, Machine_Name、1 つ以上の行を返す 1 つの列があるとします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フィドルを参照してください

それが役立つことを願っています

于 2012-04-23T22:11:06.300 に答える