Этот запрос SQL Server работаетДополнительные столбцы в SELECT COUNT()
SELECT
dbo.sem_computer.COMPUTER_ID, COUNT(dbo.sem_computer.COMPUTER_ID) as Duplicate_Hardware_IDs
FROM
dbo.sem_computer, [dbo].[V_SEM_COMPUTER], dbo.SEM_CLIENT, dbo.SEM_AGENT, dbo.IDENTITY_MAP
WHERE
sem_computer.COMPUTER_ID = [dbo].[V_SEM_COMPUTER].COMPUTER_ID
and sem_computer.COMPUTER_ID = dbo.SEM_CLIENT.COMPUTER_ID
and sem_computer.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
and dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
and dbo.SEM_AGENT.TIME_STAMP > DATEDIFF(second, '19700101', DATEADD(day, -1, GETDATE())) * CAST(1000 as bigint)
GROUP BY dbo.sem_computer.COMPUTER_ID
HAVING COUNT(dbo.sem_computer.COMPUTER_ID) > 1
ORDER BY Duplicate_Hardware_IDs DESC;
Но я хочу SELECT
дополнительные колонки (чтобы показать, какие компьютеры имеют дублирующие COMPUTER_ID
)
SELECT
dbo.sem_computer.COMPUTER_NAME
, [IP_ADDR1_TEXT]
, dbo.SEM_AGENT.AGENT_VERSION
, dbo.sem_computer.COMPUTER_ID, COUNT(dbo.sem_computer.COMPUTER_ID) as Duplicate_Hardware_IDs
FROM
dbo.sem_computer, [dbo].[V_SEM_COMPUTER], dbo.SEM_CLIENT, dbo.SEM_AGENT, dbo.IDENTITY_MAP
WHERE
sem_computer.COMPUTER_ID = [dbo].[V_SEM_COMPUTER].COMPUTER_ID
and sem_computer.COMPUTER_ID = dbo.SEM_CLIENT.COMPUTER_ID
and sem_computer.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
and dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
and dbo.SEM_AGENT.TIME_STAMP > DATEDIFF(second, '19700101', DATEADD(day, -1, GETDATE())) * CAST(1000 as bigint)
GROUP BY dbo.sem_computer.COMPUTER_ID
HAVING COUNT(dbo.sem_computer.COMPUTER_ID) > 1
ORDER BY Duplicate_Hardware_IDs DESC;
Я получаю ошибку
Столбец «dbo.sem_computer.COMPUTER_NAME» недействителен в списке выбора, потому что он не содержится либо в агрегатной функции, либо в предложении GROUP BY.
Как исправить?
UPDATE: когда я исполню
SELECT
dbo.sem_computer.COMPUTER_NAME
, [IP_ADDR1_TEXT]
, dbo.SEM_AGENT.AGENT_VERSION
, dbo.sem_computer.COMPUTER_ID, COUNT(dbo.sem_computer.COMPUTER_ID) as Duplicate_Hardware_IDs
FROM
dbo.sem_computer, [dbo].[V_SEM_COMPUTER], dbo.SEM_CLIENT, dbo.SEM_AGENT, dbo.IDENTITY_MAP
WHERE
sem_computer.COMPUTER_ID = [dbo].[V_SEM_COMPUTER].COMPUTER_ID
and sem_computer.COMPUTER_ID = dbo.SEM_CLIENT.COMPUTER_ID
and sem_computer.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
and dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
and dbo.SEM_AGENT.TIME_STAMP > DATEDIFF(second, '19700101', DATEADD(day, -1, GETDATE())) * CAST(1000 as bigint)
GROUP BY dbo.sem_computer.COMPUTER_NAME,[IP_ADDR1_TEXT], dbo.SEM_AGENT.AGENT_VERSION, dbo.sem_computer.COMPUTER_ID
HAVING COUNT(dbo.sem_computer.COMPUTER_ID) > 1
ORDER BY Duplicate_Hardware_IDs DESC;
это приводит к
COMPUTER_NAME IP_ADDR1_TEXT AGENT_VERSION COMPUTER_ID Duplicate_Hardware_IDs
ABC 10.10.10.10 12.1 56604FEE0AF 3
Но я ищу
COMPUTER_NAME IP_ADDR1_TEXT AGENT_VERSION COMPUTER_ID Duplicate_Hardware_IDs
ABC 10.10.10.10 12.1 56604FEE0AF 3
123 10.10.10.15 12.2 56604FEE0AF 3
XYZ 10.10.10.25 12.2 56604FEE0AF 3
UPDATE 2:
Я включил FROM
и WHERE
Добавить COMPUTER_NAME в группу по – NMK
Попробуйте мой [ответ] (http://stackoverflow.com/a/26387167/2246380), если вы не хотите группировать по столбцам, которые могут уменьшить строки в результате, который является что случилось с вами? – Ram
На основе вашего обновления: хотите ли вы видеть дубликаты, рассчитанные для каждого COMPUTER_NAME, или вы хотите, чтобы общее количество дубликатов с таким же номером появлялось для каждого COMPUTER_NAME? –