SQL 服务器:按行求和输出
SQL Server : Sum by Row to output
正在尝试显示相同行的总和作为输出。
这是SQL代码
SELECT
replace(replace(replace(replace(dbo.IDENTITY_MAP.Name,'My Company\',''),'-VLAN2',''),'.VLAN2\',''),'.Instr\','') as Site,
Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END) AS 'Windows-SEP-11',
Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END) AS 'Mac-SEP-11',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END) AS 'Windows-SEP-12',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END) AS 'Mac-SEP-12'
FROM
dbo.sem_computer
INNER JOIN
[dbo].[V_SEM_COMPUTER] ON [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN
dbo.SEM_AGENT ON SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
INNER JOIN
dbo.SEM_CLIENT ON dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN
dbo.IDENTITY_MAP ON dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
INNER JOIN
dbo.PATTERN ON dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
WHERE
Name LIKE '%31r%'
GROUP BY
dbo.IDENTITY_MAP.Name
ORDER BY
Site
这是输出
但是,我希望输出看起来像
我通过在 Count 周围添加 SUM()
并按名称分组来更新 SQL 代码,但出现错误
Cannot perform an aggregate function on an expression containing an aggregate or subquery.
代码:
SELECT
replace(replace(replace(replace(dbo.IDENTITY_MAP.Name,'My Company\',''),'-VLAN2',''),'.VLAN2\',''),'.Instr\','') as Site,
SUM(Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END)) AS 'Windows-SEP-11',
SUM(Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END)) AS 'Mac-SEP-11',
SUM(Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END)) AS 'Windows-SEP-12',
SUM(Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END)) AS 'Mac-SEP-12'
FROM
dbo.sem_computer
INNER JOIN
[dbo].[V_SEM_COMPUTER] ON [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN
dbo.SEM_AGENT ON SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
INNER JOIN
dbo.SEM_CLIENT ON dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN
dbo.IDENTITY_MAP ON dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
INNER JOIN
dbo.PATTERN ON dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
WHERE
Name LIKE '%31r%'
GROUP BY
Name
谢谢!
您的分组依据需要与您想要分组的依据完全匹配。由于您正在更改 "dbo.IDENTITY_MAP.Name" 的文本,因此您需要将其用作分组依据。
SELECT replace(replace(replace(replace(dbo.IDENTITY_MAP.Name,'My Company\',''),'-VLAN2',''),'.VLAN2\',''),'.Instr\','') as Site,
Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END) AS 'Windows-SEP-11',
Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END) AS 'Mac-SEP-11',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END) AS 'Windows-SEP-12',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END) AS 'Mac-SEP-12'
FROM dbo.sem_computer
INNER JOIN [dbo].[V_SEM_COMPUTER]
ON [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN dbo.SEM_AGENT
ON SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
INNER JOIN dbo.SEM_CLIENT
ON dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN dbo.IDENTITY_MAP
ON dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
INNER JOIN dbo.PATTERN
ON dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
WHERE Name LIKE '%31r%'
Group by replace(replace(replace(replace(dbo.IDENTITY_MAP.Name,'My Company\',''),'-VLAN2',''),'.VLAN2\',''),'.Instr\','')
Order by Site
正在尝试显示相同行的总和作为输出。
这是SQL代码
SELECT
replace(replace(replace(replace(dbo.IDENTITY_MAP.Name,'My Company\',''),'-VLAN2',''),'.VLAN2\',''),'.Instr\','') as Site,
Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END) AS 'Windows-SEP-11',
Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END) AS 'Mac-SEP-11',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END) AS 'Windows-SEP-12',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END) AS 'Mac-SEP-12'
FROM
dbo.sem_computer
INNER JOIN
[dbo].[V_SEM_COMPUTER] ON [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN
dbo.SEM_AGENT ON SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
INNER JOIN
dbo.SEM_CLIENT ON dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN
dbo.IDENTITY_MAP ON dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
INNER JOIN
dbo.PATTERN ON dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
WHERE
Name LIKE '%31r%'
GROUP BY
dbo.IDENTITY_MAP.Name
ORDER BY
Site
这是输出
但是,我希望输出看起来像
我通过在 Count 周围添加 SUM()
并按名称分组来更新 SQL 代码,但出现错误
Cannot perform an aggregate function on an expression containing an aggregate or subquery.
代码:
SELECT
replace(replace(replace(replace(dbo.IDENTITY_MAP.Name,'My Company\',''),'-VLAN2',''),'.VLAN2\',''),'.Instr\','') as Site,
SUM(Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END)) AS 'Windows-SEP-11',
SUM(Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END)) AS 'Mac-SEP-11',
SUM(Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END)) AS 'Windows-SEP-12',
SUM(Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END)) AS 'Mac-SEP-12'
FROM
dbo.sem_computer
INNER JOIN
[dbo].[V_SEM_COMPUTER] ON [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN
dbo.SEM_AGENT ON SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
INNER JOIN
dbo.SEM_CLIENT ON dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN
dbo.IDENTITY_MAP ON dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
INNER JOIN
dbo.PATTERN ON dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
WHERE
Name LIKE '%31r%'
GROUP BY
Name
谢谢!
您的分组依据需要与您想要分组的依据完全匹配。由于您正在更改 "dbo.IDENTITY_MAP.Name" 的文本,因此您需要将其用作分组依据。
SELECT replace(replace(replace(replace(dbo.IDENTITY_MAP.Name,'My Company\',''),'-VLAN2',''),'.VLAN2\',''),'.Instr\','') as Site,
Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END) AS 'Windows-SEP-11',
Count (CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END) AS 'Mac-SEP-11',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%' THEN 1
END) AS 'Windows-SEP-12',
Count(CASE
WHEN dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%' THEN 1
END) AS 'Mac-SEP-12'
FROM dbo.sem_computer
INNER JOIN [dbo].[V_SEM_COMPUTER]
ON [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN dbo.SEM_AGENT
ON SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
INNER JOIN dbo.SEM_CLIENT
ON dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN dbo.IDENTITY_MAP
ON dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
INNER JOIN dbo.PATTERN
ON dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
WHERE Name LIKE '%31r%'
Group by replace(replace(replace(replace(dbo.IDENTITY_MAP.Name,'My Company\',''),'-VLAN2',''),'.VLAN2\',''),'.Instr\','')
Order by Site