显示与其他数据关联的唯一SQL记录
我正在尝试编写SQL来检索环境中所有Windows 10设备的列表,以及它们是否安装了Acrobat Reader 我希望它只为每个设备返回一行,以及一个“是”或“否”指示是否安装了读卡器 到目前为止,我已经:显示与其他数据关联的唯一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
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中。这只是一种逃避的手段吗?它是如何工作的?@JustusThaneMAX
是一个聚合函数。正如您在发布的结果中所看到的,您将有许多No
值和一个yes
。通过按Netbios\u Name0
分组,并在No
和Yes
之间选择MAX
值,如果有,结果将是Yes
,如果没有,结果将是No
我仍然不知道MAX在这里是如何工作的。如果我在ARP.DisplayName0(如“%Acrobat Reader%”)时将其更改为,则“否”或“是”
我希望结果完全相反。然而,事实并非如此。相反,对于每一行,它只返回“Yes”。我很高兴它能工作,但我想了解原因。@JustusThane您需要阅读有关MAX
和聚合函数的内容。如果更改大小写
表达式,可以看到将得到许多yes
值,可能还有一个no
值。yes
和no
之间的MAX
值是多少?因为它们是字符串,yes
是最大值