SQL:计算区别并组合同名

时间:2016-12-21 20:41:12

标签: sql-server tsql sql-server-2014

语言:T-SQL
服务器:SQL Server 2014

我有一张个人电脑桌,希望得到制造商对每部电脑的统计。这很简单,但是当从每台PC中提取数据时,一些较旧的HP计算机将其制造商报告为“Hewlett-Packard”,而较新的计算机将其制造商报告为“HP”。我想把它们组合成“HP”。不进行任何替换/组合的查询如下:

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

基于当前查询的示例输出:

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

期望的输出:

Manufacturer      Number of Each
Dell Inc.         10
HP                12

如何重写查询以合并“HP”和“Hewlett-Packard”COUNTs?

4 个答案:

答案 0 :(得分:2)

在制造商列上使用REPLACE以获取所需的格式化字符串。

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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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)中的外键列。