Discussione:
Esiste idea furba per trasformare righe in colonne?
(troppo vecchio per rispondere)
tiriamoavanti
2008-09-12 09:07:32 UTC
Permalink
Devo scrivere una SP denormalizzare una tabella con un bel po' di campi
portando in colonne dedicate gli importi dipendenti da un tipo record.

A e B rappresentano dimensione da mettere in group by
TP è il campo che controlla la "colonizzazione"

in sql server 2000 mi ammazzo di group by e varie join o ho idee furbe?
DROP TABLE #PIPPO

GO

CREATE TABLE #PIPPO

(A CHAR(10), B CHAR(10), TP CHAR(1), IMP INT)

GO

INSERT #PIPPO VALUES('AAAA','BBBB','X',10)

INSERT #PIPPO VALUES('AAAA','BBBB','X',10)

INSERT #PIPPO VALUES('AAAA','CCCC','X',10)

INSERT #PIPPO VALUES('AAAA','BBBB','W',5)

INSERT #PIPPO VALUES('AAAA','CCCC','W',15)

INSERT #PIPPO VALUES('DDDD','EEEE','W',10)

--RISULTATO

AAAA BBBB X 20 5

AAAA CCCC X 10 15

DDDD EEEE W 0 10
AlessandroD
2008-09-12 09:26:28 UTC
Permalink
Post by tiriamoavanti
[...]
--RISULTATO
AAAA BBBB X 20 5
AAAA CCCC X 10 15
DDDD EEEE W 0 10
Sicuro che il risultato invece non debba essere:

AAAA BBBB X 20 W 5
AAAA CCCC X 10 W 15
DDDD EEEE X 0 W 10

Altrimenti non ho capito la tua logica.
--
Ciao, Alessandro
/*
Alessandro Dereani - MVP SQL Server - http://mvp.support.microsoft.com
*/
tiriamoavanti
2008-09-12 09:56:41 UTC
Permalink
no, detta la tabella
(A CHAR(10), B CHAR(10), TP CHAR(1), IMP INT)
TP scompare e l'aggregazione avviene su A e B con sommatoria di IMP che
viene distribuito su varie colonne tante quante sono i TP

quindi la riga di chiave "DDDD EEEE" avrà 0 nella colonna IMP_X e 10 nella
IMP_W
AlessandroD
2008-09-12 10:20:42 UTC
Permalink
Post by tiriamoavanti
no, detta la tabella
(A CHAR(10), B CHAR(10), TP CHAR(1), IMP INT)
TP scompare e l'aggregazione avviene su A e B con sommatoria di IMP che
viene distribuito su varie colonne tante quante sono i TP
quindi la riga di chiave "DDDD EEEE" avrà 0 nella colonna IMP_X e 10 nella
IMP_W
Che però non è quello che hai indicato come risultato... che risultato vuoi?
Da come scrivi però il "layout" della soluzione di matteus dovrebbe essere
quella che cerchi, no?
--
Ciao, Alessandro
/*
Alessandro Dereani - MVP SQL Server - http://mvp.support.microsoft.com
*/
matteus
2008-09-12 09:29:19 UTC
Permalink
Post by tiriamoavanti
Devo scrivere una SP denormalizzare una tabella con un bel po' di campi
portando in colonne dedicate gli importi dipendenti da un tipo record.
A e B rappresentano dimensione da mettere in group by
TP è il campo che controlla la "colonizzazione"
in sql server 2000 mi ammazzo di group by e varie join o ho idee furbe?
DROP TABLE #PIPPO
GO
CREATE TABLE #PIPPO
(A CHAR(10), B CHAR(10), TP CHAR(1), IMP INT)
GO
INSERT #PIPPO VALUES('AAAA','BBBB','X',10)
INSERT #PIPPO VALUES('AAAA','BBBB','X',10)
INSERT #PIPPO VALUES('AAAA','CCCC','X',10)
INSERT #PIPPO VALUES('AAAA','BBBB','W',5)
INSERT #PIPPO VALUES('AAAA','CCCC','W',15)
INSERT #PIPPO VALUES('DDDD','EEEE','W',10)
A me è uscita questa senza particolari problemi. Può andare se hai
pochi valori per TP (e pochi campi simili) perchè devi creare un campo
per ogni valore della colonna TP. Nell'esempio che hai fatto viene
bene ma con N valori preferirei spararmi... o aspettare che qualcuno
posti un esempio più "pratico" (leggasi: parametrico, con CTE
ricorsive o altri ammenicoli a me sconosciuti).

SELECT a, b,
(SELECT SUM(imp) FROM #pippo p1 WHERE p1.a=p0.a AND p1.b=p0.b AND
p1.tp = 'X'),
(SELECT SUM(imp) FROM #pippo p2 WHERE p2.a=p0.a AND p2.b=p0.b AND
p2.tp = 'W')
FROM #pippo p0
GROUP BY a, b

HTH,
Matteo
matteus
2008-09-12 09:31:03 UTC
Permalink
Dimenticavo...
Post by matteus
SELECT a, b,
        (SELECT SUM(imp) FROM #pippo p1 WHERE p1.a=p0.a AND p1.b=p0.b AND p1.tp = 'X') AS X,
        (SELECT SUM(imp) FROM #pippo p2 WHERE p2.a=p0.a AND p2.b=p0.b AND p2.tp = 'W') AS W
FROM #pippo p0
GROUP BY a, b
M.
tiriamoavanti
2008-09-12 12:16:14 UTC
Permalink
"matteus" <***@gmail.com> ha scritto nel messaggio news:cdd2be3c-7667-4010-b604-***@a70g2000hsh.googlegroups.com...

Grazie Matteus, adesso ci provo a trasportarla nel mio delirio, ma intanto
ti ringrazio non mi era vento in mente... mi stavo perdendo in un delirio di
join! Ti offro una versione leggermente diversa (che se i campi sono tanti
evita la ripetizione della group by):

p.s. peccato che non esista una "GROUP BY ALL" :)

SELECT DISTINCT a, b,

(SELECT SUM(imp) FROM #pippo p1 WHERE p1.a=p0.a AND p1.b=p0.b AND p1.tp =
'X') AS X,

(SELECT SUM(imp) FROM #pippo p2 WHERE p2.a=p0.a AND p2.b=p0.b AND p2.tp =
'W') AS W

FROM #pippo p0

Continua a leggere su narkive:
Loading...