2017-02-09 11 views
0

自分の環境内のすべてのWindows 10デバイスのリストを取得するSQLと、Acrobat Readerがインストールされているかどうかを確認します。他のデータに結合された一意のSQLレコードを表示

Readerがインストールされているかどうかを示す「Yes」または「No」とともに、各デバイスに対して1行だけを返すようにします。

は、これまでのところ私が持っている:

SELECT distinct 
    SV.Netbios_Name0, 
CASE 
    WHEN ARP.DisplayName0 LIKE '%Acrobat Reader%' THEN 
     'Yes' 
    ELSE 
     'No' 
    END as 'Has Reader', 
    ARP.DisplayName0 
FROM 
    dbo.v_R_System_Valid as SV 
    JOIN dbo.v_Add_Remove_Programs as ARP 
     on SV.ResourceID = ARP.ResourceID 
    JOIN dbo.v_GS_OPERATING_SYSTEM as OS 
     on SV.ResourceID = OS.ResourceID 
WHERE 
    OS.Caption0 LIKE '%Windows 10%' 
GROUP BY 
    SV.Netbios_Name0, 
    ARP.DisplayName0, 
    OS.Caption0 

問題は、これは、各デバイスにインストールされた各アプリケーションのための行を返します:

SQL Results

ありがとうございます!

+0

あなたはサンプルスキーマを共有できますか –

答えて

2

GROUP BY(およびSELECT)からDisplayName0列を削除する必要があります。これを行う必要があります:

SELECT 
    SV.Netbios_Name0, 
    MAX(CASE 
      WHEN ARP.DisplayName0 LIKE '%Acrobat Reader%' THEN 
       'Yes' 
      ELSE 
       'No' 
     END) [Has Reader] 
FROM 
    dbo.v_R_System_Valid as SV 
    JOIN dbo.v_Add_Remove_Programs as ARP 
     on SV.ResourceID = ARP.ResourceID 
    JOIN dbo.v_GS_OPERATING_SYSTEM as OS 
     on SV.ResourceID = OS.ResourceID 
WHERE 
    OS.Caption0 LIKE '%Windows 10%' 
GROUP BY 
    SV.Netbios_Name0; 
+0

ああ!綺麗な。 ** MAX **の目的は何ですか? –

+0

それがなければ、SQLはGROUP BYに含まれていない列を選択していると文句を言います。それを回避するのは単なるハックですか?どのように機能するのですか? –

+0

@JustusThane「MAX」は集約関数です。そして、あなたが掲示した結果で見ることができるように、あなたは多くの「いいえ」価値と1つの「はい」を持つでしょう。 'Netbios_Name0'でグループ化し、' No'と 'Yes'の間の' MAX'値を選択すると、結果は 'yes'になり、なければ' no'になります。 – Lamak

関連する問題