【问题标题】:Concatenate many rows into a single text string with DISTINCT clause?使用 DISTINCT 子句将多行连接成单个文本字符串?
【发布时间】:2014-01-28 17:11:26
【问题描述】:

这很接近,但与“将多行连接成单个文本字符串”Concatenate many rows into a single text string?的帖子不同

但我需要的是,因为表/行有许多相同的名称,我只希望显示 DISTINCT 名称。因此,在上述帖子和谷歌的帮助下,我得以成功......

171444  ACTIVE,ACTIVE,ACTIVE,ACTIVE,ACTIVE,ACTIVE,ACTIVE,ACTIVE

169171 RETIRED,RETIRED,RETIRED,RETIRED,RETIRED

173648  RETIRED,RETIRED,RETIRED,RETIRED,INELIGIBLE,INELIGIBLE

我想要的是:

171444  ACTIVE

169171 RETIRED

173648  RETIRED,INELIGIBLE

我想我成功了:

Select distinct ST2.EmployeeID, 
           substring((Select DISTINCT (',' + ( ST1.AccrualStatus )) AS [text()]
            From dbo.Plan2 ST1
            Where ST1.EmployeeID = ST2.EmployeeID
            For XML PATH ('')),2, 1000) [Plan2]
     From dbo.Plan2 ST2

SUBSTRING 中需要第二个 DISTINCT 以确保我们只为每个值返回一个出现值。

【问题讨论】:

  • 我发布了解决方案,因为我无法回答自己的问题。希望对其他人有所帮助。
  • 希望得到一些帮助,现在我需要更新另一个表中显示连接项的字段,但是我的更新语句在更新时失败,只能在选择列表中指定一个表达式当子查询没有用 EXISTS 引入时。

标签: tsql concatenation distinct


【解决方案1】:

此答案来自您的上一条评论。

假设您有一个表至少包含一个 [EmployeeID] 列和一个 [Statuses] VARCHAR 列,其宽度足以包含您的任意状态字符串(我认为它们是状态),您可以做的是:

UPDATE OT1
SET OT1.[Statuses] = OT2.[text]
FROM [OtherTable] AS OT1
JOIN (
    Select distinct ST2.EmployeeID, 
           substring((Select DISTINCT (',' + ( ST1.AccrualStatus )) AS [text()]
            From dbo.Plan2 ST1
            Where ST1.EmployeeID = ST2.EmployeeID
            For XML PATH ('')),2, 1000) [Plan2]
    From dbo.Plan2 ST2
) AS OT2([EmployeeID],[text])
    ON OT1.[EmployeeID] = OT2.[EmployeeID];

我希望这行得通。

【讨论】:

    【解决方案2】:
    CREATE TABLE T2
        (
          pr VARCHAR(20) ,
          pt VARCHAR(20) ,
          qty INT
        );
    
    INSERT  INTO T2
            ( pr, pt, qty )
    VALUES  ( 'A', 'x1', 10 ),
            ( 'A', 'x2', 12 ),
            ( 'A', 'x1', 15 ),
            ( 'B', 'x1', 1 ),
            ( 'B', 'x5', 5 ),
            ( 'C', 'x5', 8 );
    
    
    SELECT  g1.pt ,
            SUM(qty) AS SumQty ,
            STUFF(( SELECT DISTINCT
                            ', ' + g.pr
                    FROM    T2 g
                    WHERE   g.pt = g1.pt
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS pr
    FROM    T2 g1
    GROUP BY g1.pt
    
    
    
    
    CREATE TABLE T2
        (
          pr VARCHAR(20) ,
          pt VARCHAR(20) ,
          qty INT
        );
    
    INSERT  INTO T2
            ( pr, pt, qty )
    VALUES  ( 'A', 'x1', 10 ),
            ( 'A', 'x2', 12 ),
            ( 'A', 'x1', 15 ),
            ( 'B', 'x1', 1 ),
            ( 'B', 'x5', 5 ),
            ( 'C', 'x5', 8 );
    
    
    SELECT  g1.pt ,
            SUM(qty) AS SumQty ,
            STUFF(( SELECT DISTINCT
                            ', ' + g.pr
                    FROM    T2 g
                    WHERE   g.pt = g1.pt
                  FOR
                    XML PATH('')
                  ), 1, 1, '') AS pr
    FROM    T2 g1
    GROUP BY g1.pt
    

    结果:

    pt---------SumQty------pr

    x1----------------- 26-----------------A, B​​p>

    x2----------------- 12-----------------A

    x5------------------13-----------------B, C

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-16
      • 2014-06-02
      • 2015-10-30
      • 2018-12-21
      • 2021-08-26
      • 2012-02-02
      • 1970-01-01
      相关资源
      最近更新 更多