语言: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?
答案 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)中的外键列。