Newsgroup: it.comp.appl.access
Titolo: [MS SQL] ordinare una tabella pivot

Ho adattato una semplice query che crea una tabella pivot, mettendo il 
codice prodotto sulle righe, i vari listini nelle colonne e il prezzo 
nelle caselle; fin qui tutto ok, funziona
 
ora però vorrei che i codici dei prodotti venissero ordinati 
(crescente) ma non capisco dove infilare sto benedetto ORDER BY
 
 
 
la tabella base (per eventuali prove) è la ITM1 di SAP Business One
 
 
 
ho provato a mattere ORDER BY nella query iniziale:
    SELECT ItemCode, Price, PriceList as PL
    FROM   ITM1 
    ORDER BY ItemCode
ma dà errore:
 
Msg 1033, Level 15, State 1, Line 32
The ORDER BY clause is invalid in views, inline functions, derived 
tables, subqueries, and common table expressions, unless TOP, OFFSET or 
FOR XML is also specified.
 
 
ho provato a metterlo più sotto:
	SELECT t.ItemCode, t.Price, t.PL
	FROM   #tmp1 t
     ORDER BY ItemCode
 
ma dà lo stesso errore
 
 
altro non mi viene in mente, se non di preordinare la tabella ITM1 con 
una query da usare poi nei passi successivi, oppure di dirottare 
l'output del codice SQL finale in una seconda tabella temporanea per 
poi rileggerla ordinata come vorrei, ma entrambe le "soluzioni", sempre 
che funzionino, mi sembrano giri astrusi
 
 
 
quindi chiedo a voi: dove posso mettere ORDER BY, se si può metterlo?
 
 
 
/*
Query a campi incrociati
estrae i listini e li incasella per listino e prodotto
*/
 
 
-- query pivot con costruzione della lista dei campi (colonne) con 
numero listino
 
DECLARE 
  @columns NVARCHAR(MAX) = '', 
  @sqlcmd  NVARCHAR(MAX) = ''
 
-- seleziona i listini da incolonnare
SELECT   @columns+=QUOTENAME(PriceList) + ','
FROM     ITM1
GROUP BY PriceList
ORDER BY PriceList;
 
-- toglie l'ultima virgola
SET @columns = LEFT(@columns, LEN(@columns) - 1)
 
-- crea tabella temporanea 
-- versione con solo il codice prodotto e il prezzo
SELECT * into #tmp1 from 
    ( 
    SELECT ItemCode, Price, PriceList as PL
    FROM   ITM1 
	) tmp1
 
-- costruisce SQL, presa da 
https://stackoverflow.com
 
SET @sqlcmd ='
	SELECT * FROM   
	(
		SELECT t.ItemCode, t.Price, t.PL
		FROM   #tmp1 t
	) t 
	PIVOT(
		MAX(t.Price) 
		FOR t.PL IN ('+ @columns +')
	) AS pivot_table;
	';
 
-- esegue il codice SQL con output a video
EXECUTE sp_executesql @sqlcmd
 
-- rilascia la tabella temporanea
drop table #tmp1
 
 
-- 
/-\ /\/\ /\/\ /-\ /\/\ /\/\ /-\ T /-\
-=- -=- -=- -=- -=- -=- -=- -=- - -=-


cambia qualcosa se metti
 
  SELECT  top 100 percent ItemCode, Price, PriceList as PL
     FROM   ITM1
     ORDER BY ItemCode
 
 
BFS
 
 
 
 

      *ORDER BY ItemCode*
 
sì, non dà più errore :)
se tolgo "top 100 percent" si ripresenta
 
mah, misteri di SQL
 
grazie


 
 
 
non è che sia un mistero eh :-)
 
metti su google quel "The ORDER BY clause is invalid in views, inline 
functions, derived
tables, subqueries, and common table expressions, unless TOP,
OFFSET or FOR XML is also specified"
 
e avrai la spiegazione tecnica
 
 
BFS

 
 
ok, ma se il default è tirar fuori tutti i record (quando non specifico 
nulla) perché la cosa non funziona se non glielo dico esplicitamente?
non voglio una risposta, sottolineo una "stranezza"
