Utilisation de SQL-Server 2012

J'ai le tableau suivant:

Id      Description 
6192    Salzburg
6193    Salzburg
6194    Salzburg
6196    Innsbruck
6197    Innsbruck
6198    Innsbruck
6199    Innsbruck
6201    Bregenz
6202    Bregenz
6203    Bregenz

Je souhaite sélectionner chaque «description» distincte avec tous les identifiants réunis dans une chaîne:

    Description     Ids
    Salzburg        '6192,6193,6194'
    Innsbruck       '6196,6197,6198'

J'ai vu du code similaire sur ce site [Comment concaténer du texte de plusieurs lignes en une seule chaîne de texte dans SQL Server?, mais je ne pouvais pas encore le comprendre pour mon objectif (je ne veux pas utiliser XML Path !). Voici ce que j'ai essayé jusqu'à présent:

DECLARE @ids AS Nvarchar(MAX)
SELECT  @ids = COALESCE(@ids + ',', '') + CAST(t.Id AS nvarchar(5))
    FROM (SELECT tmp.Id FROM (SELECT id, [Description] FROM tblMasterPropValues WHERE IdCategory = 253 AND IsActive = 1) as tmp
        WHERE [Description] = tmp.[Description]) AS t
SELECT @ids
--SELECT DISTINCT [Description], @ids AS IDs FROM tblMasterPropValues WHERE IdCategory = 253 AND IsActive = 1 AND Id IN (@ids)

Je ne peux pas vraiment comprendre et j'apprécierais toute aide à ce sujet.

1
Developer 20 nov. 2018 à 14:14

4 réponses

Meilleure réponse

Vous pouvez essayer d'utiliser la fonction STUFF()

SELECT description,  Ids = STUFF(
             (SELECT ',' + Id
              FROM tblMasterPropValues t1
              WHERE t1.description = t2.description
              FOR XML PATH (''))
             , 1, 1, '') from tblMasterPropValues t2
group by description;
1
Fahmi 20 nov. 2018 à 11:17

Vous pouvez également le faire en utilisant le CTE récursif

DECLARE @tblMasterPropValues TABLE (Id INT, Description VARCHAR(20))
INSERT INTO @tblMasterPropValues VALUES
(6192 , 'Salzburg'),
(6193 , 'Salzburg'),
(6194 , 'Salzburg'),
(6196 , 'Innsbruck'),
(6197 , 'Innsbruck'),
(6198 , 'Innsbruck'),
(6199 , 'Innsbruck'),
(6201 , 'Bregenz'),
(6202 , 'Bregenz'),
(6203 , 'Bregenz')



;WITH Tbl AS 
(
    SELECT 
        *, 
        ROW_NUMBER() OVER(PARTITION BY Description ORDER BY Id) AS RN,
        COUNT(*) OVER(PARTITION BY Description) AS CNT
    FROM @tblMasterPropValues 
)
, Rcr AS (
    SELECT *, CAST(Id AS varchar(max)) Ids 
    FROM Tbl WHERE RN = 1
        UNION ALL
    SELECT T.*, Rcr.Ids + ',' + CAST(T.Id AS VARCHAR(10)) Ids 
    FROM Rcr 
        INNER JOIN Tbl T ON T.RN = Rcr.RN + 1 and Rcr.Description = T.Description
)
SELECT RN, Description, Ids FROM Rcr 
WHERE RN = CNT

Résultat:

Description          Ids
-------------------- -----------------------
Salzburg             6192,6193,6194
Innsbruck            6196,6197,6198,6199
Bregenz              6201,6202,6203
0
Serkan Arslan 20 nov. 2018 à 12:02

Essaye ça:

DECLARE @Table TABLE(ID INT, Description VARCHAR(25))
INSERT INTO @Table
VALUES (6192,'Salzburg' )
,(6193,'Salzburg' )
,(6194,'Salzburg' )
,(6196,'Innsbruck')
,(6197,'Innsbruck')
,(6198,'Innsbruck')
,(6199,'Innsbruck')
,(6201,'Bregenz'     )
,(6202,'Bregenz'     )
,(6203,'Bregenz'     )

Requête:

SELECT DISTINCT T2.Description, 
    SUBSTRING(
        (
            SELECT ','+CAST(T1.ID AS VARCHAR)  AS [text()]
            FROM @Table T1
            WHERE T1.Description = T2.Description
            ORDER BY T1.Description
            FOR XML PATH ('')
        ), 2, 1000) [Ids]
FROM @Table T2

Résultat:

Description Ids
Bregenz     6201,6202,6203
Innsbruck   6196,6197,6198,6199
Salzburg    6192,6193,6194
0
DineshDB 20 nov. 2018 à 11:24

Pour que FOR XML PATH() soit la bonne clause, vous pouvez faire:

SELECT DISTINCT v.description, STUFF(v1.ids, 1, 1, '''') + '''' 
FROM tblMasterPropValues v CROSS APPLY
     (SELECT ', '+ CAST(v1.Id AS VARCHAR(255))
      FROM tblMasterPropValues v1
      WHERE v1.description = v.description 
      FOR XML PATH('')
     ) v1(ids);
1
Yogesh Sharma 20 nov. 2018 à 11:21