10 messaggi dal 24 maggio 2006
Ciao a tutti,
sto impazzendo per realizzare una tabella a campi incrociatisu sql server 2005.
Ho una tabella di partenza che e' la seguente:



http://i42.tinypic.com/2a94oxu.jpg

la mia necessita' e di ottenere la seguente tabella a campi incrociati:


http://i44.tinypic.com/11gm4jp.jpg

considerate che le date sono variabili e vanno da un minimo di 1 ad max di 3 e che anche l'elenco dei venditori e' variabile.

In access viene fatta cosi':
TRANSFORM Sum(vendite.[NumVendite]) AS SumOfNumVendite
SELECT vendite.[Venditore], vendite.[Prodotto], Sum(vendite.[NumVendite]) AS [Total Of NumVendite], Sum([NumVendite])-1 AS [Total Of NumVendite-1]
FROM vendite
GROUP BY vendite.[Venditore], vendite.[Prodotto]
PIVOT vendite.[Data];


ed in sql???
grazie e spero che qualcuno riesca ad aiutarmi
Modificato da mazinga il 14 febbraio 2012 18.58 -
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
In SQL Server 2005 è stato introdotto l'operatore PIVOT di cui trovi info a partire da questo link

http://msdn.microsoft.com/en-us/library/ms177410.aspx

Tuttavia anche l'operatore PIVOT non è dinamico e prevede che vengano stabiliti i parametri in maniera statica. Puoi ovviare a questo utilizzando SQL dinamico per comporre la stringa da eseguire poi con il metodo EXECUTE o sp_executesql. In alternativa, senza scomodare l'operatore PIVOT che è sicuramente più ostico, la soluzione al tuo problema puoi ottenerla con una query simile a

SELECT Venditore, Prodotto,
SUM(Vendite),
SUM(CASE Data WHEN '20120201' THEN Vendite ELSE 0 END),
SUM(CASE Data WHEN '20120202' THEN Vendite ELSE 0 END),
SUM(CASE Data WHEN '20120203' THEN Vendite ELSE 0 END)
FROM Tabella
GROUP BY Venditore, Prodotto

Anche in questo caso dovrai costruire dinamicamente la stringa in funzione di quante e quali sono le date da prendere in esame.

Bye
10 messaggi dal 24 maggio 2006
Grazie.
Ci provero'...eventualmente vi scomodo nuovamente :)
10 messaggi dal 24 maggio 2006
ho provato e funziona a perfezione :)

adesso vorrei fare una altra cosa ma non riesco...

ho imlementanto il tutto mettendo tre parametri al posto delle date:

SELECT Venditore, Prodotto,
SUM(Vendite),
SUM(CASE Data WHEN @data THEN Vendite ELSE 0 END) as giorno1,
SUM(CASE Data WHEN @data1 THEN Vendite ELSE 0 END) as giorno2,
SUM(CASE Data WHEN @data2 THEN Vendite ELSE 0 END) as giorno3
FROM Tabella
GROUP BY Venditore, Prodotto

ed assegnando un nome alle colonne generate.
La cosa che vorrei fare e assegnare alle colonne il valore di ogni parametro, ovvero @data,@data1 e @data2 consiederando che sono datetime.
E' fattibile? se si come?

Grazie
1.024 messaggi dal 19 dicembre 2003
Contributi | Blog
No, non puoi assegnare i nomi di colonna tramite variabili. Puoi farlo solo costruendo la stringa dinamicamente.

Bye
10 messaggi dal 24 maggio 2006
cioa,
potresti farmi un esempio magari sul mio caso?
sono neofita di sql e non so come fare.
grazie
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
viene fuori una "porcheria" ma puoi "giocare" similarmente a
SET NOCOUNT ON;
DECLARE @param date = GETDATE();
DECLARE @cmd varchar(100);
SET @cmd = 'SELECT GETDATE() AS ' + QUOTENAME(CONVERT(varchar(10), @param, 103));
EXEC (@cmd);
--<----------
16/02/2012
-----------------------
2012-02-16 23:36:44.323


come Luca ha gia' indicato, costruisci dinamicamente la stringa del comando SQL da eseguire, rinominando le colonne come desiderato, ed alla fine esegui il comando generato..
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.