Newsgroup: it.comp.lang.visual-basic
Titolo: Order by personalizzato

Salve a tutti,
ecco il mio problema: ho una tabella in SQL server con 3000 prodotti da cui
ne voglio estrarre una decina passandogli degli IDPRODOTTO e ordinandoli
secondo l'ordine che gli ho attribuito. Esempio:
110,200,300,50,15
110 Prodotto a
200 Prodotto xxx
300 Prodotto ddd
50   Prodotto sss
15   Prodotto asas
Vorrei evitare di fare un ciclo per ogni id prodotto .... è possibile
modificare l'order by in modo da poterlo fare in una sola query (qualcosa
del tipo order by idprodotto=110, idprodotto=200, idprodotto=300,
idprodotto=50 ...... )?
Grazie a tutti e buon lavoro

 15   Prodotto asas
Bisognerebbe capire come viene estratta la sequenza "110,200,300,50,15".
Se sono valori che derivano da un'altra query/tabella (chiamiamola t2) si
puň fare qualcosa tipo:
SELECT t1.*, (select t2.valore) from t1 order by t2.valore (non l'ho
testata, probabilmente va messa a posto la sintassi)
Se la sequenza di numeri č piccola, puoi utilizzare la formula di
termoPilucco:
SELECT t1.*
FROM t1 order by
abs((id-110)*((id-200)+1)*((id-300)+2)*((id-50)+3)*((id-15)+4) )
Ovviamente č una lamerata, e oggi non sono in condizioni mentali tali da
poterne assicurare il funzionamento :)
<x:termoPilucco>, ancora bagnato.

 abs((id-110)*((id-200)+1)*((id-300)+2)*((id-50)+3)*((id-15)+4) )
Uh... lascia stare questa lamerata.
Meglio provare altre vie.
<x:termoPilucco>

 15   Prodotto asas
Credo che l'unica soluzione sia una UNION
SELECT * FROM tabella WHERE IDProdotto = 110
UNION
SELECT * FROM tabella WHERE IDProdotto = 200
UNION
...
Ma non credo che il recordset risultante sia aggiornabile.
Ciao

> Bisognerebbe capire come viene estratta la sequenza "110,200,300,50,15".
    I numeri sono inseriti manualmente dall' utente selezionando i prodotti
....solo che voglio evitare di dover fare un ciclo di n prodotti per
riuscire a mantenere l'ordine che ha scelto ....

 UNION
        Ciao ho provato, il problema č che continua a ordianarle per
IDProdotto crescente e non secondo l'ordine che gli passo io. Ossia
IDProdotto 110,200,50 gli ordina  50,110,200

 Ma non credo che il recordset risultante sia aggiornabile.
Mi è venuta in mente un'altra lamerata:
select  * FROM tabella
order by
iif(id=110,1,0)+iif(id=200,2,0)+iif(id=300,3,0)+iif(id=50,4,0)+iif(id=15,5,0
)
E' lenta, ha limitazioni nel numero di elementi ordinabili, ma è
aggiornabile ed utilizzabile per piccole liste.
<x:termoPilucco>

"Vb"  ha scritto:

"110,200,300,50,15".

Allora
Crea una tabella d'appoggio t2 (con due campi: ct numerico e id numerico)
Inserisci i valori scelti dall'utente nel campo id ed un numero crescente
nel campo ct
Infine esegui
"SELECT t1.*   from t1 inner join t2 on 
t1.id
=
t2.id
  order by  t2.ct"
Ricordati solo di ripulire la tabella t2 prima e dopo l'uso.
<x:termoPilucco>

 IDProdotto 110,200,50 gli ordina  50,110,200
Fai così:
SELECT *, ORDINE = 1 FROM tabella WHERE IDProdotto = 110
UNION
SELECT *, ORDINE = 2 FROM tabella WHERE IDProdotto = 200
UNION
...
ORDER BY ORDINE
(non so se Access usa l'ultimo order by come globale o solo per l'ultima 
select, in questo caso prova con:
SELECT * FROM (
SELECT *, ORDINE = 1 FROM tabella WHERE IDProdotto = 110
UNION
SELECT *, ORDINE = 2 FROM tabella WHERE IDProdotto = 200
UNION
...
) ORDER BY ORDINE
Ciao

 aggiornabile ed utilizzabile per piccole liste.
Non so cosa faccia questa, ma non credo funzioni :)
L'order by <numero> agisce sul campo di indice <numero> e non sul record.
Ciao

 L'order by <numero> agisce sul campo di indice <numero> e non sul record.
No, agisce anche su manipolazioni di campi: es: "order by ID+1"
Manipolando un po'  di più ottengo
iif(id=110,1,0) che mi da' 1 quando trovo 110, altrimenti 0
iif(id=200,2,0) che mi da' 2 quando trovo 200, altrimenti 0
...
sommando i valori ottengo il risultato desiderato.
Non è certo un metodo elegante e scalabile, però.
<x:termoPilucco>

Fammi capire.
Tu vorresti estrarre una serie di record ed ordinarli secondo l'ordine in
cui li ha inseriti l'utente?
Se č cosě io ti consiglio:
crei un contatore nella tabella che si autoincrementa ogni volta che
l'utente inserisce un nuovo dato. Otterresti quindi:
--------------------------------------
| cont |  ID  |   NomeProd |    Altro    |
--------------------------------------
|   1   | 110 |    Prodotto    |     a         |
--------------------------------------
|   2   | 200 |    Prodotto    |  xxxx       |
--------------------------------------
|   3   | 300 |   Prodotto     |  ddd        |
--------------------------------------
e cosě via. poi ti basterebbe fare un order by cont