2014-03-24 3 views
0

두 개 이상의 바이러스 백신 소프트웨어가 설치된 모든 컴퓨터의 목록을 가져 오는 쿼리를 작성하고 있습니다. 불행히도 쿼리를 반환 할 수 없습니다. 당신은 내가 장치 1, 2에 대한 데이터가 포함됩니다 내 결과 집합을 작업 쿼리를받을 때 그래서 내가 설정에게 데이터를 아래의 스크린 샷에서 볼 및 3SQL 쿼리가 행을 반환하지 않습니다.

Devices Table

Antivirus Products Table

수 있듯이 여기

내가 현재 가지고 무엇을 : 당신은 안티 바이러스 이름이 필요하지 않은 경우

SELECT d.ip_address AS "IP Address", 
     d.name AS "Computer Name", 
     av.name AS "Antivirus Name", 
     COUNT(av.deviceID) AS "# of AV Installed" 
FROM devices d JOIN anti_virus_products av 
ON d.deviceID = av.deviceID 
GROUP BY d.ip_address, d.name, av.name 
HAVING COUNT(av.deviceID) > 1; 

답변

3

당신은 SELECTGROUP BY으로부터 안티 바이러스 이름 av.name을 제거해야합니다. 결과에이 값을 포함하면 GROUP BY은 각 컴퓨터 및 바이러스 백신 이름에 대해 새 행을 만듭니다. 그 값은 고유 한 그룹을 만들기 때문입니다. 장치에 설치된 모든 AV 소프트웨어의 이름을 나열 쿼리를 확장 의견에 따라

SELECT d.ip_address AS "IP Address", 
     d.name AS "Computer Name", 
     COUNT(av.deviceID) AS "# of AV Installed" 
FROM devices d JOIN anti_virus_products av 
ON d.deviceID = av.deviceID 
GROUP BY d.ip_address, d.name 
HAVING COUNT(av.deviceID) > 1; 

업데이트 :

당신은 COUNT 기능을 분할 할 수 있습니다. 이에 대한 오라클 문서에 대한 링크를 찾을 수 없지만 OVER Clause의 SQL Server 구문은 Oracle과 함께 작동하는 것으로 보입니다. 이 예제 쿼리는 각 장치 및 바이러스 백신 쌍에 대해 하나 개의 행을 반환하고 장치에 설치된 AV의 총 수를 포함 SQL Fiddle

SELECT d.ip_address AS "IP Address", 
     d.name AS "Computer Name", 
     d.deviceid, 
     av.name AS "Antivirus Name", 
     COUNT(*) OVER (PARTITION BY d.ip_address, d.name) AS "Total # of AV Installed" 
FROM devices d JOIN anti_virus_products av 
ON d.deviceID = av.deviceID 
GROUP BY d.ip_address, d.name, d.deviceid, av.name; 

에이 예제 쿼리를 참조하십시오.

이렇게하면 문제가 해결 될지는 모르겠지만 원하는 추가 데이터를 제공합니다.

+0

감사합니다! 이러한 쿼리를 확장하여 이러한 장치에 설치된 바이러스 백신 소프트웨어의 모든 이름을 나열하려면 어떻게해야합니까? – tylerbhughes

0

, 당신의 쿼리에서 가져 가라. 그렇게하면 쿼리의 어딘가에 필요합니다. 내가 어디 있는지 알아낼거야.

and device.deviceid in 
(select deviceid 
from 
(select deviceid, count(*) records 
from anti_virus_products 
group by device_id 
having count(*) > 1) temp 
) 
+0

내부 쿼리는 1 개 이상의 열 ... – KrazzyNefarious

+0

죄송를 반환합니다. 더 이상. –

1

group by 절에서 av.name 만 제거하면됩니다. 귀하의 쿼리는 같은 바이러스 백신 소프트웨어가 여러 번 설치되어있는 컴퓨터를 반환 - 같지도 않은 시나리오 : 단일 행의 바이러스 백신 소프트웨어의 이름을 원하는 경우

SELECT d.ip_address AS "IP Address", 
     d.name AS "Computer Name", 
     COUNT(av.deviceID) AS "# of AV Installed" 
FROM devices d JOIN 
    anti_virus_products av 
    ON d.deviceID = av.deviceID 
GROUP BY d.ip_address, d.name 
HAVING COUNT(av.deviceID) > 1; 

, 당신은 listagg()를 사용할 수 있습니다. 다음은 listagg에 대한 Oracle 설명서 페이지입니다. http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions089.htm#SQLRF30030

+0

실제로 여러 개의 바이러스 백신 소프트웨어가 설치된 컴퓨터를 반환합니다. 예를 들어 컴퓨터에 Trend Micro와 AVG가 설치된 경우 해당 컴퓨터 이름과 2 개의 다른 AV 프로그램이 설치되어 있기 때문에 2를 반환합니다. – tylerbhughes

1

다른 사람들은 데드 리 그룹 당 여러 AV 이름이 있으므로 AV 이름으로 그룹화 할 수 없습니다. 이 쿼리는 카운트와 함께 각 컴퓨터에 대해 AV 이름의 쉼표로 구분 된 목록을 반환합니다

SELECT d.ip_address AS "IP Address", 
     d.name AS "Computer Name", 
     (select name + ',' from anti_virus_products where deviceid = d.deviceid for xml path('')) AS "Antivirus Name", 
     avc."# of AV Installed" 
FROM devices d 
    JOIN (select deviceid,count(*) AS "# of AV Installed" from anti_virus_products 
      group by deviceid having count(*) > 1) avc 
     ON d.deviceID = avc.deviceID 
+0

흥미로운 접근 방식. –

관련 문제