在SQL中使用嵌套select语句有困难
我正在尝试创建一个ConfigMgr报告,该报告将显示我们环境中每个笔记本电脑的3个注册表项值。我的查询如下所示:在SQL中使用嵌套select语句有困难,sql,sql-server-config-manager,Sql,Sql Server Config Manager,我正在尝试创建一个ConfigMgr报告,该报告将显示我们环境中每个笔记本电脑的3个注册表项值。我的查询如下所示: Select distinct SYS.Netbios_Name0, (Select REG.Value0 where REG.KeyPath0='HKEY_LOCAL_MACHINE\SOFTWARE\BatteryDesignCapacity' ) as BatteryDesignCapacity, (Select REG.Value0 where REG.KeyPath0=
Select distinct
SYS.Netbios_Name0,
(Select REG.Value0 where REG.KeyPath0='HKEY_LOCAL_MACHINE\SOFTWARE\BatteryDesignCapacity' ) as BatteryDesignCapacity,
(Select REG.Value0 where REG.KeyPath0='HKEY_LOCAL_MACHINE\SOFTWARE\BatteryFullChargedCapacity' ) as BatteryFullChargedCapacity,
(Select REG.Value0 where REG.KeyPath0='HKEY_LOCAL_MACHINE\SOFTWARE\BatteryHealth' ) as BatteryHealth
from v_GS_Registry_Values0 REG
INNER JOIN v_R_System_Valid SYS
ON SYS.ResourceID = REG.ResourceID
ORDER BY SYS.Netbios_Name0
然而,当我运行该报告时,每个笔记本电脑名称对应4行。一行包含笔记本电脑名称和所有空白注册表值,下一行仅包含BatteryDesignCapacity值,第三行仅包含BatteryFullChargedCapacity,第四行仅包含BatteryHealth
我做错了什么?是否可以通过修改select语句将所有4个注册表值放在一行中?似乎每台计算机都有多行注册表值0。 您可以试试这个,或者使用SQLPivot函数
SELECT DISTINCT
SYS.Netbios_Name0
,MAX( CASE
WHEN REG.KeyPath0 = 'HKEY_LOCAL_MACHINE\SOFTWARE\BatteryDesignCapacity' THEN REG.Value0
END
) AS BatteryDesignCapacity
,MAX( CASE
WHEN REG.KeyPath0 = 'HKEY_LOCAL_MACHINE\SOFTWARE\BatteryFullChargedCapacity' THEN REG.Value0
END
) AS BatteryFullChargedCapacity
,MAX( CASE
WHEN REG.KeyPath0 = 'HKEY_LOCAL_MACHINE\SOFTWARE\BatteryHealth' THEN REG.Value0
END
) AS BatteryHealth
FROM v_GS_Registry_Values0 AS REG
INNER JOIN v_R_System_Valid AS SYS ON SYS.ResourceID = REG.ResourceID
GROUP BY
SYS.Netbios_Name0;
我认为您需要条件聚合:
SELECT SYS.Netbios_Name0,
MAX(CASE WHEN REG.KeyPath0 = 'HKEY_LOCAL_MACHINE\SOFTWARE\BatteryDesignCapacity' THEN REG.Value0 END) as BatteryDesignCapacity,
MAX(CASE WHEN REG.KeyPath0 = 'HKEY_LOCAL_MACHINE\SOFTWARE\BatteryFullChargedCapacity' THEN REG.Value0 END) as BatteryFullChargedCapacity,
MAX(CASE WHEN REG.KeyPath0 ='HKEY_LOCAL_MACHINE\SOFTWARE\BatteryHealth' THEN REG.Value0 END) as BatteryHealth
FROM v_GS_Registry_Values0 REG INNER JOIN
v_R_System_Valid SYS
ON SYS.ResourceID = REG.ResourceID
GROUP BY SYS.Netbios_Name0
ORDER BY SYS.Netbios_Name0