22 messaggi dal 03 settembre 2008
Salve a tutti,
ecco il mio problema di oggi

Ho una select così:
"SELECT IDEsterno, Nome FROM Tabella"
che mi restituisce questo:
1 Audi
1 Mercedes
2 Volvo
2 Saab
2 BMW

avrei bisogno di avere un output del tipo:
1 Audi, Mercedes
2 Volvo, Saab, BMW

ovvero una sorta di group by su "IDEsterno" che però "unisca" il campo "Nome".

Potete aiutarmi please??
Grazie mille!
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
djfdx wrote:
Salve a tutti,
ecco il mio problema di oggi

Ho una select così:
"SELECT IDEsterno, Nome FROM Tabella"
che mi restituisce questo:
1 Audi
1 Mercedes
2 Volvo
2 Saab
2 BMW

avrei bisogno di avere un output del tipo:
1 Audi, Mercedes
2 Volvo, Saab, BMW

ovvero una sorta di group by su "IDEsterno" che però "unisca" il campo "Nome".

Potete aiutarmi please??
Grazie mille!

puoi eseguire l'accumulazione in vari modi, ad esempio anche la funzionalita' supportata indirettamente anche da una variabile di tipo varchar, similarmente a
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
Id int,
Data varchar(10)
);
GO
INSERT dbo.t VALUES ( 2, 'Volvo' );
INSERT dbo.t VALUES ( 1, 'Audi' );
INSERT dbo.t VALUES ( 2, 'Saab' );
INSERT dbo.t VALUES ( 1, 'Mercedes' );
INSERT dbo.t VALUES ( 2, 'BMW' );
GO
CREATE FUNCTION dbo.ufn_ConcatById (
@Id int
) RETURNS varchar(1000)
AS BEGIN
DECLARE @buf varchar(1000);
SET @buf = '';

SELECT @buf = @buf + CASE WHEN LEN(@buf) <> 0 THEN ', ' ELSE '' END + Data FROM dbo.t
WHERE Id = @Id
ORDER BY Data;

RETURN (@buf);
END;
GO
SELECT Id, dbo.ufn_ConcatById (Id) AS [Tutte le auto]
FROM dbo.t
GROUP BY id;
GO
DROP FUNCTION dbo.ufn_ConcatById;
DROP TABLE dbo.t;
--<-------
Id Tutte le auto
---------
-----------------
1 Audi, Mercedes
2 BMW, Saab, Volvo

considera pero' che la parallelizzazione su piu' cpu di quanto sopra potrebbe dare risultati non effettivamente ordinati come richiesto dovuto al merge delle operazioni (parallelizzate) di selezione..

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
22 messaggi dal 03 settembre 2008
Fantastico, come sempre hai colto nel segno!
Permettimi la confidenza... Andrea, se non ci fossi, bisognerebbe inventarti

Grazie mille!
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
Permettimi la confidenza... Andrea, se non ci fossi, bisognerebbe inventarti

allora ti porto a casa per spiegarlo a mia moglie
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
Andrea Montanari [MVP] [Staff] wrote:
considera pero' che la parallelizzazione su piu' cpu di quanto sopra potrebbe dare risultati non effettivamente ordinati come richiesto dovuto al merge delle operazioni (parallelizzate) di selezione..

mi ero dimenticato di proseguire.. comunque, la soluzione piu' corretta per le accumulazioni "di stringhe" fa uso della clausola FOR XML PATH, come di seguito..

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
Id int,
Data varchar(10)
);
GO
INSERT dbo.t VALUES ( 2, 'Volvo' );
INSERT dbo.t VALUES ( 1, 'Audi' );
INSERT dbo.t VALUES ( 2, 'Saab' );
INSERT dbo.t VALUES ( 1, 'Mercedes' );
INSERT dbo.t VALUES ( 2, 'BMW' );
GO
WITH Cte AS
(
SELECT Id,
(SELECT ', ' + Data AS [text()]
FROM dbo.t AS A2
WHERE A2.Id = A1.Id
ORDER BY Data
FOR XML PATH('')) AS [All cars]
FROM dbo.t AS A1
)
SELECT DISTINCT Id,
STUFF( [All cars], 1, 2, '') AS [All Cars]
FROM Cte;

GO
DROP TABLE dbo.t;
--<-------
Id All Cars
---------
-----------------------
1 Audi, Mercedes
2 BMW, Saab, Volvo


saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
5 messaggi dal 23 ottobre 2008
Grazie, mi è tornato utilissimo anche a me.

Sara
5 messaggi dal 23 ottobre 2008
Grazie 1000! Mi è tornato utilissimo anche a me.

Sara

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.