Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
SQL Server 2000/2005/2008, Express, Access, MySQL, Oracle
SUM(campo) dove campo è STRINGA
giovedì 03 novembre 2005 - 15.27
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
fornonad
Profilo
| Newbie
40
messaggi | Data Invio:
gio 3 nov 2005 - 15:27
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
5.625
messaggi | Data Invio:
gio 3 nov 2005 - 21:57
> 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
40
messaggi | Data Invio:
ven 4 nov 2005 - 08:02
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
5.625
messaggi | Data Invio:
ven 4 nov 2005 - 10:09
>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
Torna su
Stanze Forum
Elenco Threads
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 !