Select 来自同一列的多个值
Select multiple values from the same column
我正在尝试编写一个 SCCM 查询,我必须在其中将“MS Office”、“MS Visio”和“MS Project”的安装版本拉到单独的列中。所有值都位于同一列中。
下面的查询非常粗略但有效。问题是它不是按主机名 (CS.Name0
) 聚合的。 “MS Office”、“MS Visio”和“MS Project”的输出是单独的行。要求是根据主机名聚合它。 “分组依据”无效。
Select DISTINCT
CS.Name0 AS [Computer Name],
SW.ProductName0,
CS.UserName0 as 'User',
DR.LastLogonUser as 'Last Logon User',
DR.PrimaryUser as 'Primary User',
DR.CurrentLogonUser as 'Current Logon User',
Case When (SW.ProductName0 LIKE 'Microsoft Office Standard%' OR SW.ProductName0 LIKE 'Microsoft Office Professional%' OR SW.ProductName0 LIKE 'Microsoft Office Enterprise%'
OR SW.ProductName0 LIKE 'Microsoft Office 365%'
AND SW.ProductName0 NOT LIKE '%MUI%'
AND SW.ProductName0 NOT LIKE '%Proofing%'
AND SW.ProductName0 NOT LIKE '%Herramientas%'
AND SW.ProductName0 NOT LIKE '%components%') Then SW.ProductName0 End As 'Office version',
Case When (SW.ProductName0 LIKE '%Microsoft Visio%') Then Sw.ProductName0 End As 'MS Visio',
Case When (SW.ProductName0 LIKE '%Microsoft Project%') Then Sw.ProductName0 End As 'MS Project'
FROM v_GS_INSTALLED_SOFTWARE SW
INNER JOIN v_GS_COMPUTER_SYSTEM CS ON SW.ResourceID = CS.ResourceID
RIGHT JOIN v_CombinedDeviceResources DR ON DR.MachineID=CS.ResourceID
WHERE SW.ProductName0 LIKE 'Microsoft Office Standard%'
OR SW.ProductName0 LIKE 'Microsoft Office Professional%'
OR SW.ProductName0 LIKE 'Microsoft Office Enterprise%'
OR SW.ProductName0 LIKE 'Microsoft Office 365%'
AND SW.ProductName0 NOT LIKE '%MUI%'
AND SW.ProductName0 NOT LIKE '%Proofing%'
AND SW.ProductName0 NOT LIKE '%Herramientas%'
AND SW.ProductName0 NOT LIKE '%components%'
OR SW.ProductName0 LIKE '%Microsoft Visio%'
OR SW.ProductName0 LIKE '%Microsoft Project%'
AND SW.ProductName0 <> ''
ORDER BY
CS.Name0
我得到的输出是
Computer_Name User Last_Logon_User Primary_User Current_Logon_User Office_version MS_Visio MS_Project
hostname1 user user1 user2 user3 Microsoft Office 365 ProPlus
hostname1 user user1 user2 user3 Microsoft Visio Professional 2016
hostname1 user user1 user2 user3 Microsoft Project Professional 2016
hostname2 userA user1A user2A user3A Microsoft Office 365 ProPlus
hostname2 userA user1A user2A user3A Microsoft Visio Professional 2016
期望的输出是
Computer_Name User Last_Logon_User Primary_User Current_Logon_User Office_version MS_Visio MS_Project
hostname1 user user1 user2 user3 Microsoft Office 365 ProPlus Microsoft Visio Professional 2016 Microsoft Project Professional 2016
hostname2 userA user1A user2A user3A Microsoft Office 365 ProPlus Microsoft Visio Professional 2016
不知道我的查询是否正确。它可能需要完全改变。我尝试了很多东西,但没有任何效果。一些帖子建议使用 INNER JOIN
从同一列中获取多个值,但我无法做到这一点。我不是开发人员,而是安全人员。 SCCM 是一种具有基础架构清单的工具。
如果每个 computer_name
每个 Microsoft Office 产品只需要一个结果,请执行以下操作:
with current_results as (
CS.Name0 AS Computer_Name,
CS.UserName0 as UserID,
DR.LastLogonUser as Last_Logon_User,
DR.PrimaryUser as Primary_User,
DR.CurrentLogonUser as Current_Logon_User,
SW.ProductName0 office_software
FROM v_GS_INSTALLED_SOFTWARE SW
INNER JOIN v_GS_COMPUTER_SYSTEM CS ON SW.ResourceID = CS.ResourceID
RIGHT JOIN v_CombinedDeviceResources DR ON DR.MachineID=CS.ResourceID
WHERE SW.ProductName0 LIKE 'Microsoft Office Standard%'
OR SW.ProductName0 LIKE 'Microsoft Office Professional%'
OR SW.ProductName0 LIKE 'Microsoft Office Enterprise%'
OR SW.ProductName0 LIKE 'Microsoft Office 365%'
AND SW.ProductName0 NOT LIKE '%MUI%'
AND SW.ProductName0 NOT LIKE '%Proofing%'
AND SW.ProductName0 NOT LIKE '%Herramientas%'
AND SW.ProductName0 NOT LIKE '%components%'
OR SW.ProductName0 LIKE '%Microsoft Visio%'
OR SW.ProductName0 LIKE '%Microsoft Project%'
AND SW.ProductName0 <> ''
)
select distinct Computer_Name, UserID, Last_Logon_User, Primary_User, Current_Logon_User,
max(case when office_software like '%Office%' then office_software end) over(partition by computer_name) Office_version,
max(case when office_software like '%Visio%' then office_software end) over(partition by computer_name) MS_Visio,
max(case when office_software like '%Project%' then office_software end) over(partition by computer_name) MS_Project
from current_results
如果您要按整行列查找办公产品,您可以运行这个更简单的版本(使用之前定义的 current_results
CTE):
select Computer_Name, UserID, Last_Logon_User, Primary_User, Current_Logon_User,
max(case when office_version like '%Office%' then office_version end) Office_version,
max(case when office_version like '%Visio%' then office_version end) MS_Visio,
max(case when office_version like '%Project%' then office_version end) MS_Project
from current_results
group by 1,2,3,4,5
我正在尝试编写一个 SCCM 查询,我必须在其中将“MS Office”、“MS Visio”和“MS Project”的安装版本拉到单独的列中。所有值都位于同一列中。
下面的查询非常粗略但有效。问题是它不是按主机名 (CS.Name0
) 聚合的。 “MS Office”、“MS Visio”和“MS Project”的输出是单独的行。要求是根据主机名聚合它。 “分组依据”无效。
Select DISTINCT
CS.Name0 AS [Computer Name],
SW.ProductName0,
CS.UserName0 as 'User',
DR.LastLogonUser as 'Last Logon User',
DR.PrimaryUser as 'Primary User',
DR.CurrentLogonUser as 'Current Logon User',
Case When (SW.ProductName0 LIKE 'Microsoft Office Standard%' OR SW.ProductName0 LIKE 'Microsoft Office Professional%' OR SW.ProductName0 LIKE 'Microsoft Office Enterprise%'
OR SW.ProductName0 LIKE 'Microsoft Office 365%'
AND SW.ProductName0 NOT LIKE '%MUI%'
AND SW.ProductName0 NOT LIKE '%Proofing%'
AND SW.ProductName0 NOT LIKE '%Herramientas%'
AND SW.ProductName0 NOT LIKE '%components%') Then SW.ProductName0 End As 'Office version',
Case When (SW.ProductName0 LIKE '%Microsoft Visio%') Then Sw.ProductName0 End As 'MS Visio',
Case When (SW.ProductName0 LIKE '%Microsoft Project%') Then Sw.ProductName0 End As 'MS Project'
FROM v_GS_INSTALLED_SOFTWARE SW
INNER JOIN v_GS_COMPUTER_SYSTEM CS ON SW.ResourceID = CS.ResourceID
RIGHT JOIN v_CombinedDeviceResources DR ON DR.MachineID=CS.ResourceID
WHERE SW.ProductName0 LIKE 'Microsoft Office Standard%'
OR SW.ProductName0 LIKE 'Microsoft Office Professional%'
OR SW.ProductName0 LIKE 'Microsoft Office Enterprise%'
OR SW.ProductName0 LIKE 'Microsoft Office 365%'
AND SW.ProductName0 NOT LIKE '%MUI%'
AND SW.ProductName0 NOT LIKE '%Proofing%'
AND SW.ProductName0 NOT LIKE '%Herramientas%'
AND SW.ProductName0 NOT LIKE '%components%'
OR SW.ProductName0 LIKE '%Microsoft Visio%'
OR SW.ProductName0 LIKE '%Microsoft Project%'
AND SW.ProductName0 <> ''
ORDER BY
CS.Name0
我得到的输出是
Computer_Name User Last_Logon_User Primary_User Current_Logon_User Office_version MS_Visio MS_Project
hostname1 user user1 user2 user3 Microsoft Office 365 ProPlus
hostname1 user user1 user2 user3 Microsoft Visio Professional 2016
hostname1 user user1 user2 user3 Microsoft Project Professional 2016
hostname2 userA user1A user2A user3A Microsoft Office 365 ProPlus
hostname2 userA user1A user2A user3A Microsoft Visio Professional 2016
期望的输出是
Computer_Name User Last_Logon_User Primary_User Current_Logon_User Office_version MS_Visio MS_Project
hostname1 user user1 user2 user3 Microsoft Office 365 ProPlus Microsoft Visio Professional 2016 Microsoft Project Professional 2016
hostname2 userA user1A user2A user3A Microsoft Office 365 ProPlus Microsoft Visio Professional 2016
不知道我的查询是否正确。它可能需要完全改变。我尝试了很多东西,但没有任何效果。一些帖子建议使用 INNER JOIN
从同一列中获取多个值,但我无法做到这一点。我不是开发人员,而是安全人员。 SCCM 是一种具有基础架构清单的工具。
如果每个 computer_name
每个 Microsoft Office 产品只需要一个结果,请执行以下操作:
with current_results as (
CS.Name0 AS Computer_Name,
CS.UserName0 as UserID,
DR.LastLogonUser as Last_Logon_User,
DR.PrimaryUser as Primary_User,
DR.CurrentLogonUser as Current_Logon_User,
SW.ProductName0 office_software
FROM v_GS_INSTALLED_SOFTWARE SW
INNER JOIN v_GS_COMPUTER_SYSTEM CS ON SW.ResourceID = CS.ResourceID
RIGHT JOIN v_CombinedDeviceResources DR ON DR.MachineID=CS.ResourceID
WHERE SW.ProductName0 LIKE 'Microsoft Office Standard%'
OR SW.ProductName0 LIKE 'Microsoft Office Professional%'
OR SW.ProductName0 LIKE 'Microsoft Office Enterprise%'
OR SW.ProductName0 LIKE 'Microsoft Office 365%'
AND SW.ProductName0 NOT LIKE '%MUI%'
AND SW.ProductName0 NOT LIKE '%Proofing%'
AND SW.ProductName0 NOT LIKE '%Herramientas%'
AND SW.ProductName0 NOT LIKE '%components%'
OR SW.ProductName0 LIKE '%Microsoft Visio%'
OR SW.ProductName0 LIKE '%Microsoft Project%'
AND SW.ProductName0 <> ''
)
select distinct Computer_Name, UserID, Last_Logon_User, Primary_User, Current_Logon_User,
max(case when office_software like '%Office%' then office_software end) over(partition by computer_name) Office_version,
max(case when office_software like '%Visio%' then office_software end) over(partition by computer_name) MS_Visio,
max(case when office_software like '%Project%' then office_software end) over(partition by computer_name) MS_Project
from current_results
如果您要按整行列查找办公产品,您可以运行这个更简单的版本(使用之前定义的 current_results
CTE):
select Computer_Name, UserID, Last_Logon_User, Primary_User, Current_Logon_User,
max(case when office_version like '%Office%' then office_version end) Office_version,
max(case when office_version like '%Visio%' then office_version end) MS_Visio,
max(case when office_version like '%Project%' then office_version end) MS_Project
from current_results
group by 1,2,3,4,5