我有以下的看法:
item_name 2018-1 2018-2 2018-3
windows null 34 null
windows_old 3 3 44
linux 23 2 null
linux CR null null 45我想使用正则表达式(例如,组合item_name匹配‘^windows’的所有内容)将具有相似名称的行合并为一个(以及对行上的数字求和)。
因此,最终结果将是:
item_name 2018-1 2018-2 2018-3
windows 3 37 44
linux 23 2 45发布于 2018-07-12 15:01:29
您可以尝试使用CASE WHEN和SUM函数。编写一个子查询来设置相似的名称。
测试动态链接库
CREATE TABLE T(
item_name VARCHAR(50),
Col1 INT,
Col2 INT,
Col3 INT
);
INSERT INTO T VALUES ('windows',null,34,null);
INSERT INTO T VALUES ('windows_old',3,3,44);
INSERT INTO T VALUES ('linux',23,2,null);
INSERT INTO T VALUES ('linux CR',null ,null,45);查询:
SELECT
new_name as 'item_name',
SUM(CASE WHEN item_name LIKE '%'+item_name+'%' THEN Col1 END),
SUM(CASE WHEN item_name LIKE '%'+item_name+'%' THEN Col2 END),
SUM(CASE WHEN item_name LIKE '%'+item_name+'%' THEN Col3 END)
FROM (SELECT *,
coalesce(
(CASE WHEN item_name LIKE '%windows%' THEN 'windows' END),
(CASE WHEN item_name LIKE '%linux%' THEN 'linux' END)
) new_name
FROM T
) t
GROUP BY new_name 结果
| new_name | 2018-1 | 2018-2 | 2018-3 |
|----------|--------|--------|--------|
| linux | 23 | 2 | 45 |
| windows | 3 | 37 | 44 |sqlfiddle
发布于 2018-07-12 15:09:34
在没有进一步信息的情况下,我建议使用UNION (ALL):
SELECT 'windows' AS [Bezeichnung]
, COUNT/SUM(...) AS [n]
FROM [Object(s)]
WHERE [item_name] LIKE 'windows%'
UNION ALL
SELECT 'linux' AS [Bezeichnung]
, COUNT/SUM(...) AS [n]
FROM [Object(s)]
WHERE [item_name] LIKE 'linux%'发布于 2018-07-12 15:41:45
尝试一下,使用regex/patIndex
SELECT
Case patIndex ('%[ _/-]%', LTrim (item_name))
When 0 Then LTrim (item_name)
Else substring (LTrim (item_name), 1, patIndex ('%[ _/-]%', LTrim (item_name)) - 1)
End item,
SUM([2018-1]) as [2018-1],
SUM([2018-2]) as [2018-2],
SUM([2018-3]) as [2018-3]
FROM T
GROUP BY Case patIndex ('%[ _/-]%', LTrim (item_name))
When 0 Then LTrim (item_name)
Else substring (LTrim (item_name), 1, patIndex ('%[ _/-]%', LTrim (item_name)) - 1)
ENDsqlFiddle
https://stackoverflow.com/questions/51299135
复制相似问题