【问题标题】:MS SQL 2012 query to combine each duplicate found entry [duplicate]MS SQL 2012 查询以组合每个找到的重复条目 [重复]
【发布时间】:2015-11-19 14:47:24
【问题描述】:

大家好,我想创建一个查询,以便我可以将找到的每个重复项合并到一个条目中。

一个例子是:

Name        | ID    | Tag   | Address           |carNum
-------------------------------------------------------
Bob Barker  |2054   |52377  |235 Some road      |9874
Bill Gates  |5630   |69471  |014 Washington Rd. |3700
Bob Barker  |2054   |97011  |235 Some road      |9874
Bob Barker  |2054   |40019  |235 Some road      |9874
Steve Jobs  |8501   |73051  |100 Infinity St.   |4901
John Doe    |7149   |86740  |7105 Bull Rd.      |9282
Bill Gates  |5630   |55970  |014 Washington Rd. |3700
Tim Boons   |6370   |60701  |852 Mnt. Creek Rd. |7059

在上面的示例中,Bob BarkerBill Gates 都不止一次在数据库中,所以我希望输出如下:

Bob Barker|2054|52377/97011/40019       |235 Some road     |9874
Bill Gates|5630|69471/55970             |014 Washington Rd.|3700
Steve Jobs|8501|73051                   |100 Infinity St.  |4901
John Doe  |7149|86740                   |7105 Bull Rd.     |9282
Tim Boons |6370|60701                   |852 Mnt. Creek Rd.|7059

注意 Bob BarkerBill Gates 如何将标签行(重复的数据)添加到一行而不是多行。 这是因为我不想检查以前的 ID 并查看它是否与当前 ID 匹配并附加到数据中。

我希望 SQL 查询专家有一个查询来为我做这件事!

感谢您的宝贵时间和帮助!

------------------------------------------ -------------------------------------------------- --------------------------

问题已从 ACCESS DATABASE 更改为 MS SQL SERVER 2012 数据库

------------------------------------------ -------------------------------------------------- --------------------------

【问题讨论】:

  • 您正在寻找聚合字符串连接函数。 MS Access 没有。这是编写此类函数的一种方法:stackoverflow.com/questions/5174362/….
  • distinct 关键字不可用吗?从表名中选择不同的 col1、col2...
  • 我现在将使用 MS SQL Server 2012 进行查询,因为它的功能比 Access 更多。
  • 这与制作逗号分隔列表相同(只需使用 / 代替逗号)。 SO上有很多Q+As。它是重复的。这是我的答案:stackoverflow.com/a/1785923/215752

标签: sql sql-server vb.net sql-server-2012


【解决方案1】:

使用 MySQL GROUP_CONCAT 作为 Tag 字段并使用 Name 字段按数据分组。

Query:
SELECT Name,  ID, GROUP_CONCAT(Tag SEPARATOR '/') AS Tag, Address, carNum 
FROM users GROUP BY Name

【讨论】:

  • 此查询在 Access 2010 中有效吗?
  • 请查看我的 OP 以获取更新。
【解决方案2】:

你可以这样做:

CREATE TABLE MyTable    ( Name      nvarchar(50)
                        , ID        int
                        , Tag       int
                        , Address   nvarchar(50)
                        , carNum    int
                        )

INSERT INTO MyTable VALUES
  ('Bob Barker', 2054, 52377, '235 Some road'       , 9874)
, ('Bill Gates', 5630, 69471, '014 Washington Rd.'  , 3700)
, ('Bob Barker', 2054, 97011, '235 Some road'       , 9874)
, ('Bob Barker', 2054, 40019, '235 Some road'       , 9874)
, ('Steve Jobs', 8501, 73051, '100 Infinity St.'    , 4901)
, ('John Doe'  , 7149, 86740, '7105 Bull Rd.'       , 9282)
, ('Bill Gates', 5630, 55970, '014 Washington Rd.'  , 3700)
, ('Tim Boons' , 6370, 60701, '852 Mnt. Creek Rd.'  , 7059)

SELECT  YT.Name
        , ID
        , LEFT(YT.SUB, LEN(YT.SUB) - 1) AS Tags
        , Address
        , carNum
FROM    (SELECT DISTINCT
                Name
                , ( SELECT      CAST(ST1.Tag AS nvarchar(5)) + ',' AS [text()]
                    FROM        MyTable ST1
                    WHERE       ST1.ID = ST2.ID
                    ORDER BY    ST1.Name
                FOR
                 XML PATH('')
                ) SUB
              , ID
              , Address
              , carNum
         FROM   MyTable ST2
        ) YT

DROP TABLE MyTable

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 2012-06-20
    • 2014-10-29
    • 1970-01-01
    • 2016-09-06
    • 2012-01-16
    • 2019-11-22
    • 1970-01-01
    相关资源
    最近更新 更多