2017-10-18 1 views
0

J'essaie de créer une instruction select pour combiner des valeurs d'ID dupliqués sur des colonnes spécifiques.Comment créer une requête pour combiner deux ou trois lignes pour les ID dupliqués

Ma table est:

ID Name 
--------- 
01 A 
01 B 
02 C 
03 D 

Comment puis-je choisir pour obtenir des valeurs telles que: 01 A, B ID: 01. À l'heure actuelle, lorsque j'utilise Select * from Tablename, il répertorie 01 ID pour deux lignes . J'aime le combiner en une seule ligne, le nom devrait être combiné avec une virgule pour les lignes dupliquées.

Nouveau code:

select Name, ID = REPLACE 
    ((select Surname AS [data()] 
     FROM Mytable 
     WHERE Name = d. Name 
     ORDER BY Name FOR XML path('')), ' ', REQUIRED SEPERATOR) 
FROM Mytable d 
WHERE Name IS NOT NULL 
GROUP BY Name 

Merci beaucoup!

+1

Tag votre question avec la base de données que vous utilisez. –

+0

J'utilise SQL Server. Merci. –

+0

Il n'y a pas d'opérateur de type 'group_concat' dans SQLServer, donc vous ne pouvez pas le faire directement, mais il existe des méthodes pour y parvenir: https://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function -dans-microsoft-sql-server-2005 – shibormot

Répondre

0

SQL Fiddle

MS SQL Server 2014 Configuration du schéma:

create table t (id int not null, name nvarchar(max) not null) 
insert t (id, name) values 
    (1, 'A'), 
    (1, 'B'), 
    (1, 'C'), 
    (2, 'A'), 
    (2, 'D'), 
    (3, 'A'), 
    (3, 'F'), 
    (3, 'E') 

Requête 1:

select id, REPLACE 
     ((select name AS [data()] 
      FROM t as t1 
      WHERE t1.id = t0.id 
      ORDER BY Name FOR XML path('')), ' ', ',') 
    FROM t as t0 
    GROUP BY id 

Results:

| id |  | 
|----|-------| 
| 1 | A,B,C | 
| 2 | A,D | 
| 3 | A,E,F | 

MISE À JOUR Pour traiter des espaces déjà dans les noms, nous pouvons les remplacer à underscores, avant le regroupement, et le remplacer retour après:

select id, replace(REPLACE 
    ((select replace(name, ' ', '_') AS [data()] 
     FROM t as t1 
     WHERE t1.id = t0.id 
     ORDER BY Name FOR XML path('')), ' ', ','), '_', ' ') 
FROM t as t0 
GROUP BY id 
+0

Cela a fonctionné parfaitement. Merci beaucoup! –

+0

Un seul petit problème. Si le nom de la colonne comporte deux mots ou plus, comme «A B» ou «A B C», chaque espace a été remplacé par une virgule. Comment puis-je résoudre ce problème? Merci. –

+0

Vous pouvez remplacer des espaces, par exemple, des traits de soulignement avant de les concaténer, et les remplacer à nouveau après – shibormot