Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Query GROUP BY e concatenazione stringhe

327 views
Skip to first unread message

Mauro D.

unread,
Feb 1, 2008, 6:14:53 AM2/1/08
to
Ciao a tutti,
avrei bisogno di fare una query con group by su una tabella del genere....


Tabella1
--------

Cabina Durata
------ ------
C001 100
C002 100
C001 200
C003 200
C004 320


e il risultato deve dare

Gruppo Durata Cabine
------ ------ ------
1 100 C001, C002
2 200 C001, C003
3 320 C004


esiste un modo per:

a) assegnare un numero crescente a una colonna del risultato (Gruppo)?

b) raggruppare per "Durata" e avere una colonna con la lista della
colonna "Cabine" concatenata in una sola colonna?


Grazie mille per l'aiuto ma con il manuale di SQL2000 non ne vengo fuori.

Mauro

Andrea Montanari

unread,
Feb 1, 2008, 6:44:39 AM2/1/08
to
salve Mauro,

la concatenazione puo' avvenire utilizzando direttamente un'aggregazione su
una variabile di tipo varchar;
il problema di questo approccio e' sicuramente dato dalla limitazione a 8000
caratteri del tipo varchar, come anche dall'impossibilita' di avere la
certezza di un ordinamento sul risultato, visto che l'utilizzo di piu'
workers su piu' CPU puo' restituire un ordinamento falsato.. se questo non
e' un problema, puoi procedere anche in tal senso..
la clausola GROUP BY, invece, sempre restituisce un ordinamento crescente
sul risultato visto che gli operatori interni di esecuzione della query
procedono in tal senso...
la restituzione dell'ordinale, 1^ riga, 2^, etc, puoi invece accelerarla
tramite una tabella temporanea che includa una colonna con la proprieta'
identity impostata..

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Dati (
Cabina varchar(5),
Durata int
);
INSERT INTO dbo.Dati VALUES ( 'C001', 100 );
INSERT INTO dbo.Dati VALUES ( 'C002', 100 );
INSERT INTO dbo.Dati VALUES ( 'C001', 200 );
INSERT INTO dbo.Dati VALUES ( 'C003', 200 );
INSERT INTO dbo.Dati VALUES ( 'C004', 320 );
GO
CREATE FUNCTION dbo.ufn_Concat (
@Durata int
) RETURNS varchar(8000)
AS BEGIN
DECLARE @Cabine varchar(8000);
SET @Cabine = '';
SELECT @Cabine =
@Cabine
+ CASE WHEN LEN(@Cabine) > 0 THEN ', '
ELSE '' END
+ Cabina
FROM dbo.Dati
WHERE Durata = @Durata
ORDER BY Cabina;
RETURN (@Cabine);
END
GO
CREATE TABLE #t ( id int IDENTITY, Durata int, Cabine varchar(8000));
INSERT INTO #t (Durata, Cabine)
SELECT Durata, dbo.ufn_Concat(Durata)
FROM dbo.Dati
GROUP BY Durata;

SELECT * FROM #t;
DROP TABLE #t;
GO
DROP FUNCTION dbo.ufn_Concat;
DROP TABLE dbo.Dati;
--<--------
id Durata Cabine
----------- ----------- ------------


1 100 C001, C002
2 200 C001, C003
3 320 C004

saluti
--
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz http://italy.mvps.org
DbaMgr2k ver 0.21.1 - DbaMgr ver 0.65.1 and further SQL Tools
--------- remove DMO to reply


0 new messages