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