显示与其他数据关联的唯一SQL记录

显示与其他数据关联的唯一SQL记录,sql,sql-server,Sql,Sql Server,我正在尝试编写SQL来检索环境中所有Windows 10设备的列表,以及它们是否安装了Acrobat Reader 我希望它只为每个设备返回一行,以及一个“是”或“否”指示是否安装了读卡器 到目前为止,我已经: SELECT distinct SV.Netbios_Name0, CASE WHEN ARP.DisplayName0 LIKE '%Acrobat Reader%' THEN 'Yes' ELSE 'No' END as

我正在尝试编写SQL来检索环境中所有Windows 10设备的列表,以及它们是否安装了Acrobat Reader

我希望它只为每个设备返回一行,以及一个“是”或“否”指示是否安装了读卡器

到目前为止,我已经:

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
问题在于,这会为每个设备上安装的每个应用程序返回一行:


谢谢大家!

您需要从
分组依据
中删除
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;

您需要从
分组依据
(以及
选择
)中删除
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;

你能分享你的样品吗?你能分享你的样品吗!美丽的。MAX的目的是什么?如果没有它,SQL会抱怨我选择的列不包含在GROUP BY中。这只是一种逃避的手段吗?它是如何工作的?@JustusThane
MAX
是一个聚合函数。正如您在发布的结果中所看到的,您将有许多
No
值和一个
yes
。通过按
Netbios\u Name0
分组,并在
No
Yes
之间选择
MAX
值,如果有,结果将是
Yes
,如果没有,结果将是
No
我仍然不知道MAX在这里是如何工作的。如果我在ARP.DisplayName0(如“%Acrobat Reader%”)时将其更改为
,则“否”或“是”
我希望结果完全相反。然而,事实并非如此。相反,对于每一行,它只返回“Yes”。我很高兴它能工作,但我想了解原因。@JustusThane您需要阅读有关
MAX
和聚合函数的内容。如果更改
大小写
表达式,可以看到将得到许多
yes
值,可能还有一个
no
值。
yes
no
之间的
MAX
值是多少?因为它们是字符串,
yes
是最大值啊!美丽的。MAX的目的是什么?如果没有它,SQL会抱怨我选择的列不包含在GROUP BY中。这只是一种逃避的手段吗?它是如何工作的?@JustusThane
MAX
是一个聚合函数。正如您在发布的结果中所看到的,您将有许多
No
值和一个
yes
。通过按
Netbios\u Name0
分组,并在
No
Yes
之间选择
MAX
值,如果有,结果将是
Yes
,如果没有,结果将是
No
我仍然不知道MAX在这里是如何工作的。如果我在ARP.DisplayName0(如“%Acrobat Reader%”)时将其更改为
,则“否”或“是”
我希望结果完全相反。然而,事实并非如此。相反,对于每一行,它只返回“Yes”。我很高兴它能工作,但我想了解原因。@JustusThane您需要阅读有关
MAX
和聚合函数的内容。如果更改
大小写
表达式,可以看到将得到许多
yes
值,可能还有一个
no
值。
yes
no
之间的
MAX
值是多少?因为它们是字符串,
yes
是最大值