2016-12-21 2 views
2

언어 : T-SQL
서버 : SQL 서버 2014SQL은 : 고유 한 카운트와 결합 마찬가지로-명명 된

나는 PC에 테이블이 있고 각 PC의 수를 좀하고 싶습니다 제조업체. 간단하지만, 각 PC에서 데이터를 가져올 때 일부 오래된 HP 컴퓨터는 제조업체를 "Hewlett-Packard"로보고하고 최신 컴퓨터는 제조업체를 "HP"로보고합니다. 나는 이것을 "HP"에 결합하고 싶습니다. 어떤 대체하지 않습니다 쿼리/결합은 다음과 같다 :

Manufacturer  Number of Each 
Dell Inc.   10 
Hewlett-Packard 6 
HP    6 

원하는 출력 :

Manufacturer  Number of Each 
Dell Inc.   10 
HP    12 

어떻게 쿼리

SELECT 
    DISTINCT f_assetmanufacturer AS 'Manufacturer', 
    COUNT(DISTINCT f_assettagID) AS 'Number of Each' 
FROM tb_assets 
GROUP BY f_assetmanufacturer 

샘플 출력 전류 쿼리를 기반으로 "HP"와 "Hewlett-Packard"COUNT를 결합하여 재 작성해야합니까?

답변

2

제조업체 열에 REPLACE를 사용하여 필요한 형식의 문자열을 가져옵니다.

SELECT COUNT(*), REPLACE(Mfg, 'Hewlett-Packard', 'HP') 
FROM dbo.SO41271540 
GROUP BY REPLACE(Mfg, 'Hewlett-Packard', 'HP') 
+0

감사합니다,이 작동하는 것 같다. SELECT 문에서 "Replace"를 시도했지만 여전히 "12"대신 "6"만을 반환합니다. 나는 그것이 GROUP BY 문장에서도 필요하다는 것을 깨닫지 못했다. 이 옵션이 짧은 것보다 @jhilden의 응답보다 더 나은지 여부를 밝힐 수 있습니까? – Beems

+1

단일 대체를 수행해야하는 경우 내 솔루션이 더 간단합니다. 여러 이름을 바꿔야하는 경우 REPLACE 문을 연결해야합니다. 이 경우 @ jhilden의 솔루션은 훨씬 더 우아해질 것입니다. 제조업체 맵핑을 정기적으로 업데이트해야하는 경우 John Cappelletti와 같은 매핑 테이블을 만드는 것이 훨씬 더 좋습니다. 작업을 완료하는 가장 간단한 도구를 사용하십시오. –

+0

다행히도 교체 횟수를 늘릴 필요가 거의 없습니다. 현재 "HP"와 "Hewlett-Packard"는 5000 대의 PC에 24 개의 다른 제조업체가있는 데이터베이스에도 불구하고 동일합니다. 다른 제조업체들은 모두 자신들이 OS에 자신을보고하는 방식에 일관성이있는 것처럼 보입니다. – Beems

1

CASE 문을 사용할 수 있습니다. 필요한만큼 추가 절을 추가하십시오.

SELECT 
    CASE f_assetmanufacturer 
    WHEN 'Hewlett-Packard' THEN 'HP' 
    ELSE f_assetmanufacturer 
    END 
, COUNT(DISTINCT f_assettagID) 
FROM dbo.Code c 
GROUP BY CASE f_assetmanufacturer 
    WHEN 'Hewlett-Packard' THEN 'HP' 
    ELSE f_assetmanufacturer 
    END 
0

이 쿼리는 일을 할 것입니다, 그러나 하드 코드 :

SELECT 
    DISTINCT REPLACE(f_assetmanufacturer, 'Hewlett-Packard', 'HP') AS 'Manufacturer', 
    COUNT(DISTINCT f_assettagID) AS 'Number of Each' 
FROM tb_assets 
GROUP BY f_assetmanufacturer 

좋네요 솔루션은 당신이에 가입 할 수있는 "마스터"제조 업체 조회 테이블을 가지고, 그리고 것 참조 할 수있는 tb_assets (예 : ManufacturerId)의 외래 키 컬럼.

+0

다행히도 교체 횟수를 늘릴 필요성은 아주 미미합니다. 현재 "HP"와 "Hewlett-Packard"는 5000 대의 PC에 24 개의 다른 제조업체가있는 데이터베이스에도 불구하고 동일합니다. 다른 제조업체들은 모두 자신들이 OS에 자신을보고하는 방식에 일관성이있는 것처럼 보입니다. – Beems

1

시간이 지남에 따라 코드를 없애고 더 동적 인 매핑 테이블을 선택합니다. 예를 들어 :

Declare @YourResults table (Manufacturer varchar(50),[Number of Each] int) 
Insert into @YourResults values 
('Dell Inc.',   10), 
('Hewlett-Packard', 6), 
('HP',    6) 

Declare @Maping table (MapFrom varchar(50),MapTo varchar(50)) 
Insert Into @Maping values 
('Hewlett-Packard','HP'), 
('Hewlett-Packard Inc.','HP') 


Select Manufacturer= IsNull(B.MapTo,Manufacturer) 
     ,[Number of Each] = sum([Number of Each]) 
From @YourResults A 
Left Join @Maping B on (MapFrom=A.Manufacturer) 
Group By IsNull(B.MapTo,Manufacturer) 

반환

Manufacturer Number of Each 
Dell Inc.  10 
HP    12 
+0

이 쿼리를 위해 "HP"와 "Hewlett-Packard"의 결합을 넘어서 확장 할 필요는 없을 것입니다. 여기에 나와있는 예제는 매우 통찰력이 있습니다. 가까운 장래에 유사한 문제가있을 수 있습니다. 잘 생각한 응답에 감사드립니다. – Beems

+0

@ Bems Fair enough. 방금 당신 레이더에서 원했어. 빠른 이야기. 내 고객 중 한 명이 새로운 위험 등급 6W (또는 6 본질적으로 6.5)를 도입했습니다. 수천 건의 보고서와 수많은 코드를 검토해야했습니다. 나는 반면에, 오직 하나의 레코드를 나의 매핑 테이블에 추가해야만했다. –