получить уникальные записи на основе строки - PullRequest
0 голосов
/ 13 мая 2019

У меня есть таблица с записями, подобными приведенным ниже.

Таблица:

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 ]

1 голос
/ 13 мая 2019

Попробуйте это:

-- 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
0 голосов
/ 13 мая 2019

Как бы я это сделал, используя 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;
0 голосов
/ 13 мая 2019

Попробуйте это ..

select SUBSTRING(Name, CHARINDEX(' ', Name),3) AS region, SUM(value) as Value 
from example
group by (SUBSTRING(Name, CHARINDEX(' ', Name),3))

Первый столбец - это фактически серийный номер

0 голосов
/ 13 мая 2019

EDIT:

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