PIVOT in view

lunedì 05 marzo 2012 - 11.49

jjchuck Profilo | Senior Member

USE InsideTSQL2008; SELECT custid, [2006], [2007],[2008] FROM (SELECT YEAR(orderdate) AS anno, custid, freight FROM Sales.Orders ) AS SourceTab PIVOT ( sum(freight) FOR [anno] IN ( [2006], [2007],[2008]) ) AS pivotTab ORDER BY custid; GO

Il codice postato funziona ma mi chiedo cosa si possa fare per evitare di inserire il campo anno: ogni volta che passa un anno bisogna aggiungere [numero anno] ...se non ho capito male !
Ho provato ad inserire una select nella clausola IN () ma niente...non cè un metodo per ovviare al problema
thsk

alx_81 Profilo | Guru

>Il codice postato funziona ma mi chiedo cosa si possa fare per
>evitare di inserire il campo anno: ogni volta che passa un anno
>bisogna aggiungere [numero anno] ...se non ho capito male !
uno dei limiti del pivoting è proprio quello che, siccome una riga diventa colonna, non puoi sapere sempre a priori quali "anni" (nel tuo caso) dovrai gestire.
Puoi comporla con sql dinamico. Qui un esempio: http://dotnetgalactics.wordpress.com/2009/10/23/using-sql-server-20052008-pivot-on-unknown-number-of-columns-dynamic-pivot/


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

te si sforzato eh

...it's a juke...nissan juke

x fortuna stasera me arriva il testo T-SQL Query....cosi posso fa pure io il sapientino

ciao

grazie


ps:http://education.mondadori.it/scheda/978886114300

dici che so buttato 105 euri ?

alx_81 Profilo | Guru

>x fortuna stasera me arriva il testo T-SQL Query....cosi posso fa pure io il sapientino
sì sì, funziona quel manuale..
a parte gli scherzi, purtroppo è un costrutto molto macchinoso.
Puoi anche realizzarlo con la CASE:
http://www.simple-talk.com/sql/t-sql-programming/creating-cross-tab-queries-and-pivot-tables-in-sql/

>dici che so buttato 105 euri ?
un libro con autori così è SEMPRE un investimento
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

maestro dove sei...perchè mi hai abbandonato...lo so io : a te piaceva la seconda....:)

cmq se provi a eseguire
SELECT DISTINCT '],[' + ltrim(str(_year))FROM Products ORDER BY '],[' + ltrim(str(YEAR(_year))) FOR XML PATH('') ), 1, 2, '') + ']'


dice:
Msg 102, Level 15, State 1, Line 4
Incorrect syntax near ')'.

ci siamo quasi....ma non so proprio do va quella maledetta parentesi

alx_81 Profilo | Guru

>ci siamo quasi....ma non so proprio do va quella maledetta parentesi
ma cosa vuoi fare con quello statement? mica lo capisco..

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

stavo solo riproducendo il primo link che mi hai passato...
e l'errore sta li...


ps. lo so tendermi la mano è come farlo ad un ceco


cmq grazie mi hai aperto un mondo...co le pivot ce facciao tutto: in questo caso debbo fare un report dove le colonne (mesi o anni) variano
perchè purtroppo passa il tempo...


non appena padroneggio bene ci riempio l'azienda

alx_81 Profilo | Guru

>stavo solo riproducendo il primo link che mi hai passato...
>e l'errore sta li...
eh non è proprio così l'esempio.. io non vedo la STUFF

>cmq grazie mi hai aperto un mondo...co le pivot ce facciao tutto:
>in questo caso debbo fare un report dove le colonne (mesi o anni)
>variano
>perchè purtroppo passa il tempo...
occhio però, questi strumenti diventano MOLTO pesanti a lungo andare.
Soprattutto in termini di tempi di risposta.
Perchè invece non prepari i dati che ti servono e poi usi EXCEL per dare dei report agli utenti?
In questo modo puoi ottimizzare le sorgenti e demandare ad excel l'elaborazione delle matrici trasposte (PIVOT)..


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

DECLARE @years VARCHAR(2000) SELECT @years = STUFF((SELECT DISTINCT '],[' + ltrim(str(_year))FROM Products ORDER BY '],[' + ltrim(str(YEAR(_year))) FOR XML PATH('') ), 1, 2, '') + ']'
ho provato anche cosi ma giustamente mi dice
che essendoci un order by su un campo non selezionato non cè logica
cioè a te funziona(una volta creata una tab Products con _year...ecc)?


cmq...l'idea di manipolare la pivot da codice mi intriga...:)

alx_81 Profilo | Guru

>DECLARE @years VARCHAR(2000)
>SELECT @years = STUFF((SELECT DISTINCT '],[' + ltrim(str(_year))FROM
>Products
>ORDER BY '],[' + ltrim(str(YEAR(_year)))
> FOR XML PATH('')
> ), 1, 2, '') + ']'
>ho provato anche cosi ma giustamente mi dice
>che essendoci un order by su un campo non selezionato non cè
>logica
>cioè a te funziona(una volta creata una tab Products con _year...ecc)?
sostituisci YEAR(_year) con _year solamente, altrimenti l'order by non funge. In effetti l'esempio potrebbe essere buggato

>cmq...l'idea di manipolare la pivot da codice mi intriga...:)
occhio solo alle prestazioni e alle compilazioni. Essendo una query che cambia sempre il motore farà fatica a cachare i piani di esecuzione. Non riempire di queste logiche il tuo database. Meglio demandare all'applicativo.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

Great....LE SAI TUTTE E'?
amo funge...ho avuto un parossisma

Cmq come direbbe Homer Jay al dottr Hilbert (>ecco il suo cuore ha il tikettio rotto):basta con questi paroloni da medico....

E' arrivato oggi il testo...dammi tempo non asfissiarmi...
il nstro rapporto va troppo in fretta


alx_81 Profilo | Guru

>E' arrivato oggi il testo...dammi tempo non asfissiarmi...
>il nstro rapporto va troppo in fretta
e ti dirò di più, se parli dei simpson, da appassionato SFEGATATO che sono, sei finito
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

ok allora metti su il caffe per te e prepara un panino per me
mi ci vorrà tutto il pomeriggio per adattà l'esempio


ok questa e promesso oggi non te scasso piu

ho replicato l'esempio e ovviamente funziona solo che...
su una view mi da errore in prossimità della prima clausola where dentro la query da pivotare...
può essere perchè ce una case sul campo da sommare?
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