0

我有一个有一些重复行的表,我可以从中找到重复的行,看起来像这样

CREATE TABLE Holder
(
    HPKEY INT,
    HSOMEVALUE VARCHAR(50)
);

INSERT INTO HOLDER (HPKEY,HSOMEVALUE)
VALUES
(1,'abc'),
(2,'abc'),
(5,'abc'),
(7,'xyz'),
(9,'xyz')

现在我必须把结果集变成这种格式

Somvalue         MINKEY           OTHER_KEYS_EXCEPT_MIN
abc               1               2,5
xyz               7                9

但我得到了第三列中的所有键。

我已经为此创建了SQLFIDLER

4

1 回答 1

1
DECLARE @Holder TABLE
(
    HPKEY INT,
    HSOMEVALUE VARCHAR(50)
);

INSERT INTO @HOLDER (HPKEY,HSOMEVALUE)
VALUES
(1,'abc'),
(2,'abc'),
(5,'abc'),
(7,'xyz'),
(9,'xyz');

SELECT SomeValue = HSOMEVALUE, MINKEY, 
  OTHER_KEYS_EXCEPT_MIN = STUFF(
    (SELECT ',' + CONVERT(varchar(11), h2.HPKEY)
       FROM @Holder AS h2 
       WHERE h2.HSOMEVALUE = h.HSOMEVALUE
       AND h2.HPKEY > h.MINKEY
       FOR XML PATH(''), 
       TYPE).value(N'./text()[1]', N'varchar(max)'), 1, 1, N'')
  FROM 
  (
    SELECT HSOMEVALUE, MINKEY = MIN(HPKEY)
    FROM @Holder GROUP BY HSOMEVALUE
  ) AS h
  ORDER BY SomeValue;

在 SQL Server 2017+ 上,这不那么混乱,恕我直言,有STRING_AGG()

SELECT SomeValue = h.HSOMEVALUE, h.MINKEY, 
    OTHER_KEYS_EXCEPT_MIN = STRING_AGG(h2.HPKEY, ',')
  FROM @holder AS h2
  INNER JOIN 
  (
    SELECT HSOMEVALUE, MINKEY = MIN(HPKEY)
    FROM @Holder GROUP BY HSOMEVALUE
  ) AS h 
  ON h.HSOMEVALUE = h2.HSOMEVALUE
  WHERE h2.HPKEY > h.MINKEY
  GROUP BY h.HSOMEVALUE, h.MINKEY
  ORDER BY SomeValue;
于 2013-04-10T22:31:06.707 回答