根据字符串获取唯一记录

时间:2019-05-13 09:32:18

标签: sql-server sql-server-2017

我有一个表,其中包含如下记录。

表格:

ID      Name            Value
1       xxx AA           10
2       yyy B            20
3       AA zzz           11
4       xxx B            20
5       kkk C            30
6       qqq (AA) ZZ      10 
7        AA              10

我想获取通用记录并添加这些记录的值。 预期的输出表是:

TableOut

ID      Name    Value
1       AA        41
2       B         40
3       C         30 

以上仅是一些记录的示例。但是,该表有100多个记录,并且可能 将来,记录将被动态添加。 注意:我很好,如果它选择了重复的子字符串并将其作为单个记录读取。

我该如何实现?

4 个答案:

答案 0 :(得分:1)

尝试一下:

-- sample data
declare @tbl table (ID int, Name varchar(10), Value int);
insert into @tbl values
(1, 'xxx AA', 10),
(2, 'yyy B', 20),
(3, 'zzz AA', 11),
(4, 'xxx B', 20),
(5, 'kkk C', 30);
-- select query
select row_number() over (order by NewName) ID,
       NewName, 
       sum(Value) 
from (
    select substring(Name, charindex(' ', Name) + 1, len(Name)) NewName,
           Value
    from @tbl
) a group by NewName

答案 1 :(得分:0)

编辑:

SELECT SUBSTRING(name, CHARINDEX(' ', name) +1, 20), SUM(Value)
from table
group by SUBSTRING(name, CHARINDEX(' ', name) +1, 20)

答案 2 :(得分:0)

尝试一下。

{
  "iisSettings": {
    "iisExpress": {
      "applicationUrl": "http://localhost:12345",
      "sslPort": 98765 <== Change_this
    }
  },

第一列实际上是序列号

答案 3 :(得分:0)

如何使用STUFF做到这一点:

WITH VTE AS(
    SELECT *
    FROM (VALUES(1,'xxx AA',10),
                (2,'yyy B',20),
                (3,'zzz AA',11),
                (4,'xxx B',20),
                (5,'kkk C',30)) V(ID,[Name],[Value]))
SELECT ROW_NUMBER() OVER (ORDER BY N.R) AS ID,
       N.R AS [Name],
       SUM([Value]) AS [Value]
FROM VTE V
     CROSS APPLY (VALUES(STUFF(V.[Name],1,CHARINDEX(' ',V.[Name]),''))) N(R)
GROUP BY N.R
ORDER BY N.R;