Question: Je souhaite écrire une fonction d'agrégation personnalisée qui concatène une chaîne sur un groupe.Fonction d'agrégation personnalisée (concat) dans SQL Server
Alors que je peux faire une
SELECT SUM(FIELD1) as f1, MYCONCAT(FIELD2) as f2
FROM TABLE_XY
GROUP BY FIELD1, FIELD2
Tout ce que je trouve est des fonctions d'agrégation de CRL SQL, mais je dois SQL, sans CLR.
Edit: 1
La requête devrait ressembler à ceci:
SELECT SUM(FIELD1) as f1, MYCONCAT(FIELD2) as f2
FROM TABLE_XY
GROUP BY FIELD0
Edit 2:
Il est vrai qu'il est impossible sans CLR.
Cependant, la réponse de sous-sélection par astander peut être modifiée afin de ne pas encoder de caractères spéciaux.
Le changement subtil pour est d'ajouter ceci après "POUR XML PATH": ,
TYPE
).value('.[1]', 'nvarchar(MAX)')
Voici quelques exemples
DECLARE @tT table([A] varchar(200), [B] varchar(200));
INSERT INTO @tT VALUES ('T_A', 'C_A');
INSERT INTO @tT VALUES ('T_A', 'C_B');
INSERT INTO @tT VALUES ('T_B', 'C_A');
INSERT INTO @tT VALUES ('T_C', 'C_A');
INSERT INTO @tT VALUES ('T_C', 'C_B');
INSERT INTO @tT VALUES ('T_C', 'C_C');
SELECT
A AS [A]
,
(
STUFF
(
(
SELECT DISTINCT
', ' + tempT.B AS wtf
FROM @tT AS tempT
WHERE (1=1)
--AND tempT.TT_Status = 1
AND tempT.A = myT.A
ORDER BY wtf
FOR XML PATH, TYPE
).value('.[1]', 'nvarchar(MAX)')
, 1, 2, ''
)
) AS [B]
FROM @tT AS myT
GROUP BY A
SELECT
(
SELECT
',äöü<>' + RM_NR AS [text()]
FROM T_Room
WHERE RM_Status = 1
ORDER BY RM_NR
FOR XML PATH('')
) AS XmlEncodedNoNothing
,
SUBSTRING
(
(
SELECT
',äöü<>' + RM_NR AS [data()]
FROM T_Room
WHERE RM_Status = 1
ORDER BY RM_NR
FOR XML PATH('')
)
,2
,10000
) AS XmlEncodedSubstring
,
(
STUFF
(
(
SELECT ',äöü<>' + RM_NR + CHAR(10)
FROM T_Room
WHERE RM_Status = 1
ORDER BY RM_NR
FOR XML PATH, TYPE
).value('.[1]', 'nvarchar(MAX)')
, 1, 1, ''
)
) AS XmlDecodedStuffInsteadSubstring
Dans le cas de votre code d'exemple, il y aura seulement une valeur pour FIELD2 de toute façon (GROUP BY) de sorte que vous ne pas besoin de la fonction. Je suppose que votre exemple est faux. – sqlvogel
Ahahaha, bon - bon sang, tu as raison. Field0 serait un UID (group by), field1 et field2 ne devraient pas être dans la clause de groupe ... –