从同一列中选择多个值

时间:2020-08-11 13:30:29

标签: mysql sql database sccm

我试图编写一个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是具有基础结构清单的工具。

1 个答案:

答案 0 :(得分:0)

如果您希望每个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