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
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