SUM(campo) dove campo è STRINGA

giovedì 03 novembre 2005 - 15.27

fornonad Profilo | Newbie

Ho una tabella composta in questo modo:

NUM1 NUM2 UTENTE
00350 02556 ADRIANO
00350 02556 MARCO
00350 02556 ALESSANDRA

E vorrei ottenere un singolo record in questo modo

NUM1 NUM2 UTENTE
00350 02556 ADRIANO, MARCO, ALESSANDRA

Come posso fare attraverso una query con SQL Server 2000?

Esiste una funzione simile a SUM(campo) che funzioni anche con le stringhe?
SELECT NUM1, NUM2, SUM(UTENTE)
FROM tabella
GROUP BY NUM1,NUM2

Grazie a tutti per il supporto.

lbenaglia Profilo | Guru

> Ho una tabella composta in questo modo:
>
> NUM1 NUM2 UTENTE
> 00350 02556 ADRIANO
> 00350 02556 MARCO
> 00350 02556 ALESSANDRA
>
> E vorrei ottenere un singolo record in questo modo
>
> NUM1 NUM2 UTENTE
> 00350 02556 ADRIANO, MARCO, ALESSANDRA
>
> Come posso fare attraverso una query con SQL Server 2000?

Ciao fornonad,

quello di cui hai bisogno non è di una funzione di aggregazione, ma di una funzione di concatenazione.
SQL Server 2000 non offre nativamente una funzione del genere, ma nessuno ti vieta di definirne una ad-hoc.

Guarda il seguente esempio:

USE tempdb
GO

/* Definisco la tabella dbo.Utenti */
CREATE TABLE dbo.Utenti(
NUM1 char(5) NOT NULL,
NUM2 char(5) NOT NULL,
UTENTE varchar(10) NOT NULL
)
GO

/* La popolo */
INSERT dbo.Utenti VALUES('00350', '02556', 'ADRIANO')
INSERT dbo.Utenti VALUES('00350', '02556', 'MARCO')
INSERT dbo.Utenti VALUES('00350', '02556', 'ALESSANDRA')
INSERT dbo.Utenti VALUES('00400', '03000', 'LORENZO')
INSERT dbo.Utenti VALUES('00400', '03100', 'LUCA')
INSERT dbo.Utenti VALUES('00400', '03100', 'GIANLUCA')
GO

/* Definisco la user-defined function scalare dbo.ufn_ConcatenaUtenti */
CREATE FUNCTION dbo.ufn_ConcatenaUtenti(
@Num1 char(5),
@Num2 char(5)
)
RETURNS varchar(100)
AS
BEGIN
DECLARE @Utenti varchar(100)
SET @Utenti = ''

/* Concateno gli utenti separandoli con una virgola */
SELECT @Utenti = @Utenti + ',' + UTENTE
FROM dbo.Utenti
WHERE NUM1 = @Num1
AND NUM2 = @Num2
ORDER BY NUM1, NUM2

/* Elimino la virgola iniziale */
RETURN STUFF(@Utenti, 1, 1, '')
END
GO

/* Query */
SELECT
NUM1
, NUM2
, dbo.ufn_ConcatenaUtenti(NUM1, NUM2) AS Utenti
FROM dbo.Utenti
GROUP BY NUM1, NUM2
GO

/* Output:

NUM1 NUM2 Utenti
----- ----- -------------------------
00350 02556 ADRIANO,MARCO,ALESSANDRA
00400 03000 LORENZO
00400 03100 LUCA,GIANLUCA

(3 row(s) affected)

*/

/* Pulizia */
DROP FUNCTION dbo.ufn_ConcatenaUtenti
DROP TABLE dbo.Utenti


> Grazie a tutti per il supporto.
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

fornonad Profilo | Newbie

La funzione è perfetta per l'estrazione dei dati che devo effettuare, ma se volessi lasciare parametriche sia la tabella da cui estrarre i dati e lasciare libere sia i nomi che il numero delle colonne di riferimento su cui effettuare l'estrazione dei dati?

>/* Concateno gli utenti separandoli con una virgola */
>SELECT @Utenti = @Utenti + ',' + UTENTE
>FROM dbo.Utenti

UTENTI: la voglio parametrica

>WHERE NUM1 = @Num1
>AND NUM2 = @Num2
>ORDER BY NUM1, NUM2

NUM1 e NUM2: in altre occasioni poteri aver bisogno di concatenare delle stringhe in base a delle colonne con nomi differenti o anzichè avere solo due colonne potrei aver bisogno di 3/4 colonne di raggruppamento

ciao ciao adry

lbenaglia Profilo | Guru

>La funzione è perfetta per l'estrazione dei dati che devo effettuare,
>ma se volessi lasciare parametriche sia la tabella da cui estrarre
>i dati e lasciare libere sia i nomi che il numero delle colonne
>di riferimento su cui effettuare l'estrazione dei dati?

E' una pessima idea dato che dovresti ricorrere al dynamic SQL che oltre a portare dei grossi problemi di performance e di security (se utilizzato a sproposito), non è utilizzabile in una user-defined function.

Il mio consiglio è quello di scrivere tutte le funzioni di aggregazione che ti servono, garantendo in questo modo la massima efficienza e sicurezza.

Per maggiori info:

"The Curse and Blessings of Dynamic SQL"
http://www.sommarskog.se/dynamic_sql.html

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5