【问题标题】:get unique records based on string根据字符串获取唯一记录
【发布时间】:2019-05-13 09:32:18
【问题描述】:

我有一个包含如下记录的表。

表:

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

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

表格输出

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

以上只是少数记录的示例。但是,该表有超过 100 条记录,并且有可能, 将来,将动态添加记录。 注意:我很好,如果它拾取重复的子字符串并将其作为单个记录读取。

我怎样才能做到这一点?

【问题讨论】:

  • 您如何确定记录之间的共同点在哪里?你已经尝试过什么?
  • 您不是在汇总Name 列中第二个“单词”的值吗?如果你有这样的想法,那么你应该能够轻松实现这一点(提示,SUM)。
  • 如果您将Name 分成两列,一列用于xxx,另一列用于AA,这会简单得多。但它仍然可能。
  • 这里的问题是,位置可以在字符串中的任何位置,并不总是2ns的位置。
  • 这就是挑战。就像它应该选择重复的字符串并将其作为一个。刚刚改进了我的问题。希望我已经正确解释了这一点。

标签: sql-server sql-server-2017


【解决方案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

【讨论】:

    【解决方案2】:

    我会怎么做,使用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;
    

    【讨论】:

      【解决方案3】:

      试试这个..

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

      第一列实际上是一个序列号

      【讨论】:

        【解决方案4】:

        编辑:

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

        【讨论】:

        • 这行不通。 GROUP BY name 意味着 xxx AAyyy AA 没有被分组(就像来自 OP 的问题一样)
        • 对不起...没有正确阅读问题。检查此查询是否要在第一个空格字符后按字符串分组
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 2022-12-02
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        相关资源
        最近更新 更多