2016-12-21 1 views
0

저는 PC 테이블을 보유하고 있으며 최고의 PC 제조업체를 찾고 싶습니다. 데이터가 파이 차트로 표시되고 현재 ~ 45 개의 다른 제조업체가 있기 때문에 상위 5 개를 계산하고 다른 모든 데이터를 '기타'로 결합하고 싶습니다.Count TOP 5, 기타로 "기타"로 계산하십시오.

다음 쿼리는 제조업체가 모든 PC의 수를 반환합니다 : 위의 쿼리의

SELECT 
    f_assetmanufacturer, 
    COUNT(*) as 'PCs' 
FROM tb_assets 
GROUP BY f_assetmanufacturer 

샘플 출력은 다음과 같이

f_assetmanufacturer PCs 
----------------------------- 
Dell     100 
HP      50 
Lenovo     25 
Acer     24 
Toshiba    23 
Microsoft    20 
Equus     20 
Thinix     20 
Advantech    20 

원하는 출력은 다음과 같습니다

f_assetmanufacturer PCs     f_assetmanufacturer PCs 
-----------------------------    ----------------------------- 
Dell     100     Dell     100 
HP      50     Other     100 
Lenovo     25   or  HP      50 
Acer     24     Lenovo     25  
Toshiba    23     Acer     24 
Other     100     Toshiba    23 

상위 5 개 제조업체 만 선택하고 나머지 제조업체는 모두 ' 원형 차트로 출력을 단순화하기 위해 다른 카테고리?

+0

상위 5 개를 표시하고 나머지를 응용 프로그램 계층에 집어 넣는 것만 큼 .... 거의 모든 차트 기능을 통해 상위 N 퍼센트 또는 N 상위 항목을 표시하고 나머지는 롤업 할 수 있습니다. – scsimon

+0

SQL 솔루션이 간결하고 명확하며 쉽고 효율적이지 않으면 가장 확실한 해결책이 될 수 있습니다. 그러나 필자는이 작업을 수행 할 차트 기능이 없으므로 SQL 솔루션보다 오버 헤드를 추가 할 수있는 커스텀으로 작성해야합니다. – Beems

답변

1

아래처럼 함께 두 세트와 노동 조합에게 데이터를 구축하는 열팽창 계수를 사용할 수 있습니다

SELECT (CASE WHEN seqnum <= 5 THEN f_assetmanufacturer ELSE 'Other' END) as assetmanufacturer, 
     SUM(PCs) as PCs 
FROM (SELECT f_assetmanufacturer, COUNT(*) as PCs, 
      ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as seqnum 
     FROM tb_assets 
     GROUP BY f_assetmanufacturer 
    ) a 
GROUP BY (CASE WHEN seqnum <= 5 THEN f_assetmanufacturer ELSE 'Other' END) 
ORDER BY PCs DESC; 

참고 : 당신은 할 수 있습니다 당신은 집계 두 가지 수준으로이 작업을 수행 할 수 있습니다

with top5 
as (
SELECT top 5 
    f_assetmanufacturer, 
    COUNT(*) as 'PCs' 
FROM tb_assets 
GROUP BY f_assetmanufacturer 
order by 2 desc) 
,other 
as(
select 'Other', 
    COUNT(*) as 'PCs' 
FROM tb_assets a 
where not exists (select 'ne' from top5 t where a.f_assetmanufacturer = t.f_assetmanufacturer))) 

select * from top5 
union all 
select * from other 
4

rank() 또는 dense_rank()을 사용하십시오 ("다섯 번째"장소에서 타이를 처리하는 방법에 따라 다름).

+0

이것은 매우 명확하고 간결합니다. 감사합니다. 나는 원격으로도 이와 비슷한 것을 고려하지 않았다. – Beems

+0

동점 문제를 제기하는 것이 현명합니다. +1만으로 –