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