首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mssql组合具有相似值的行

mssql组合具有相似值的行
EN

Stack Overflow用户
提问于 2018-07-12 14:58:40
回答 3查看 33关注 0票数 1

我有以下的看法:

代码语言:javascript
复制
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’的所有内容)将具有相似名称的行合并为一个(以及对行上的数字求和)。

因此,最终结果将是:

代码语言:javascript
复制
item_name    2018-1    2018-2   2018-3
windows      3         37       44
linux        23        2        45
EN

回答 3

Stack Overflow用户

发布于 2018-07-12 15:01:29

您可以尝试使用CASE WHENSUM函数。编写一个子查询来设置相似的名称。

测试动态链接库

代码语言:javascript
复制
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);

查询:

代码语言:javascript
复制
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 

结果

代码语言:javascript
复制
| new_name | 2018-1 | 2018-2 | 2018-3 |
|----------|--------|--------|--------|
|    linux |     23 |      2 |     45 |
|  windows |      3 |     37 |     44 |

sqlfiddle

票数 1
EN

Stack Overflow用户

发布于 2018-07-12 15:09:34

在没有进一步信息的情况下,我建议使用UNION (ALL):

代码语言:javascript
复制
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%'
票数 0
EN

Stack Overflow用户

发布于 2018-07-12 15:41:45

尝试一下,使用regex/patIndex

代码语言:javascript
复制
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)
            END

sqlFiddle

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51299135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档