Newsgroup: it.comp.appl.access
Titolo: [SQL] Ordinare su campo calcolato da SubQuery

Scenario:
tblWeb
Contiene l'elenco delle FAQ del mio sito con PK=idFaq + altri campi
tblAccessiFaq
Contiene
PK=Counter
IdFaq relazionato lato Molti con la tabella tblWeb
Data
Dovrei estrarre da una query(SQL) le prime 10 Faq aventi il numero di
accessi
maggiore, quindi pensavo di fare una cosa simile:
SELECT tblWeb.Descrizione,
              tblWeb.idFAQ,
              (SELECT COUNT(*)
               FROM tblAccessiFaq
               Where tblAccessiFaq.IdFaq=tblWeb.IdFaq) AS NVisite
FROM tblWeb;
questa estrae i conteggi delle FAQ, ma quando tento di applicare
l'ordinamento
per il campo calcolato NVisite mi restituisce un'errore nella sintassi
SQL della
SubQuery che dovrebbe essere questa:
SELECT tblWeb.Descrizione,
              tblWeb.idFAQ,
              (SELECT COUNT(*)
               FROM tblAccessiFaq
               WHERE tblAccessiFaq.IdFaq=tblWeb.IdFaq) AS NVisite
FROM tblWeb
ORDER BY (SELECT COUNT(*)
                   FROM tblAccessiFaq
                   WHERE tblAccessiFaq.IdFaq=tblWeb.IdFaq) DESC;
A questo poi aggiungerei il TOP 10 nel caso dovesse funzionare, ma la
cosa che non
capisco e che mi sfugge è il motivo per cui senza l'ordinamento
funziona e con si pianta.
Potrei provare a fare 2 Query, ma essendo per un'applicazione WEB
preferirei
mantenere la sintassi SQL esplicita.
Grazie
@Alex

 ha scritto nel messaggio
news:1145388172.2...@t31g2000cwb.googlegroups.com...
Scenario:







Ciao Alex,
è una limitazione di Access, soprattutto quella di non poter usare l'alias
nella order By.
Incapsula tutto in una tabella derivata e poi fai l'ordinamento.
es.
----
SELECT * FROM
(
SELECT tblWeb.Descrizione,
              tblWeb.idFAQ,
              (SELECT COUNT(*)
               FROM tblAccessiFaq
               WHERE tblAccessiFaq.IdFaq=tblWeb.IdFaq) AS NVisite
FROM tblWeb) AS DRV_TBL
ORDER BY NVisite DESC;
----
Ciao
-- 
Giorgio Rancati
[Office Access MVP]

Quella dell'Alias mi era nota, ma questa proprio.....!
Funziona alla perfezione ovviamente.
Grazie.
@Alex

Mettendo  il predicato TOP il conteggio della SubQuery diventa ZERO
nonostante
soddisfi il criterio di ordinazione.....!!!
In pratica mi ordina correttamente, ma NVisite = 0 sempre...!!!
Stò un pò fondendo...!
@Alex

 ha scritto nel messaggio
news:1145390607.2...@i40g2000cwc.googlegroups.com...

scusa ma dove lo metti il TOP ?


Mi era sorto il dubbio .....!
Inizialmente lo avevo messo interno alla normale SQL, ma ci sono
rimasto male
vedendo il campo calcolato =0 quindi ho provato a metterlo esterno in
questo modo e
oltre che non funzionare(non TOPPA) dà il risultato che dicevo..!
SELECT TOP 10 * FROM
(
SELECT tblWeb.Descrizione,
              tblWeb.idFAQ,
              (SELECT COUNT(*)
               FROM tblAccessiFaq
               WHERE tblAccessiFaq.IdFaq=tblWeb.IdFaq) AS NVisite
FROM tblWeb) AS DRV_TBL 
ORDER BY NVisite DESC; 
Ciao
@Alex

Mi era sorto il dubbio .....!
;-)


 news:1145392085.0...@i40g2000cwc.googlegroups.com...
aspetta...
cosa intendi, che cosě
----
SELECT TOP 10 * FROM
(
SELECT tblWeb.Descrizione,
              tblWeb.idFAQ,
              (SELECT COUNT(*)
               FROM tblAccessiFaq
               WHERE tblAccessiFaq.IdFaq=tblWeb.IdFaq) AS NVisite
FROM tblWeb) AS DRV_TBL
ORDER BY NVisite DESC;
---
non funziona ?
no, dai deve andare :-)


In realtà così è la condizione peggiore, nel senso che non estrae i
10 ed il
campo Calcolato NVisite=0 sempre.
Se scrivo così invece:
SELECT * FROM
(
SELECT TOP 10 tblWeb.Descrizione,
              tblWeb.idFAQ,
              (SELECT COUNT(*)
               FROM tblAccessiFaq
               WHERE tblAccessiFaq.IdFaq=tblWeb.IdFaq) AS NVisite
FROM tblWeb) AS DRV_TBL
ORDER BY NVisite DESC;
Estrae effettivamente 10 Records solo, ordinati correttamente ma il
campo
calcolato =0
Strano vero...?
@Alex

Strano vero...?
Stano ma vero!!!
non ce la fa!
strategia numero2
----
SELECT TOP 10 * FROM
(
SELECT TOP 100 PERCENT
       tblWeb.Descrizione,
       tblWeb.idFAQ,
       COUNT(*) AS NVisite
FROM   tblWeb INNER JOIN tblAccessiFaq
   ON  tblWeb.IdFaq=tblAccessiFaq.IdFaq
Group By tblWeb.Descrizione,
         tblWeb.idFAQ
Order By Count(*) DESC) AS DRV_TBL
----
Ciao


Si sono rimasto un pò basito, ma penso di non scandalizzarmi
più....!
Allora questa soluzione "funzionicchia", nel senso che con l'InnerJoin
ovviamente mi taglia tutti i Records che non hanno lato Molti nessuna
visita, il risultato è che invece di vedere 10 Records vedo solo
quelli che
hanno alemeno una visita.
Però potrebbe andare bene ugualmente anche se preferisco estrarre
come prima tutti e poi ciclare solo i primi 10........!
Per ora ho risolto così, il risultato è quello che si vede nel mio
sito
estraendo i TOP 10 Visitati.....!
Visto che ho cambiato dominio e che stò rifacendo tutto in ASP:
http://www.alessandrobaraldi.it
Grazie
@Alex

come prima tutti e poi ciclare solo i primi 10........!
Secondo me funziona, ovvero fa quello per cui č stata scritta.
L'ho fatta cosě perchč ho pensato che trattandosi di classifica delle visite
dovesse includere solo le sezioni visitate.
Comunque si puň modificare e fare in modo che renda sempre 10 records, se
interessa fatti risentire.


più....!
non capisco, cosa vorresti dire ?
[RISPOSTA]
Nel senso che non mi stupisco più degli effetti speciali di access.
Secondo me funziona, ovvero fa quello per cui è stata scritta.
L'ho fatta così perchè ho pensato che trattandosi di classifica delle
visite
dovesse includere solo le sezioni visitate.
Comunque si può modificare e fare in modo che renda sempre 10 records,
se
interessa fatti risentire.
[RISPOSTA]
La tua osservazione non fà una piega, direi che tra le altre cose è
un problema
relativo, nel senso che a regime bene o male tutte le pagine verranno
visitate
quindi ritengo inutile la mia considerazione.
La tengo così com'è, ma se hai voglia a scopo didattico mio personale
mi interessa
anche vedere la modifica che volevo propormi.
Ciao
Grazie
@Alex

 @Alex
Hai rifatto un pò il tutto.
Molto gradevole.
Il dettaglio delle FAQ ricorda Pablitomf nella struttura
-- 
_ _
Ciao
MAssimiliano Amendola            
www.accessgroup.it
Cisa - Conferenza Italiana per Sviluppatori Access
Info:  
www.donkarl.com/it

anche vedere la modifica che volevo propormi.
----
SELECT TOP 10 * FROM
(
SELECT TOP 100 PERCENT
       tblWeb.Descrizione,
       tblWeb.idFAQ,
       NVisite
FROM   tblWeb LEFT JOIN
       (Select IdFaq,COUNT(*) AS NVisite
        From   tblAccessiFaq
        Group By IdFaq) AS tblAFq
   ON  tblWeb.IdFaq=tblAFq.IdFaq
Order By NVisite DESC) AS DRV_TBL
----
č sempre brutta perchč ci sono due Select Top, ma con Jet di Access di piů
non si puň.
Speriamo che il nuovo motore di Acc2007 apporti delle migliorie in questo
senso.


 
hai provato order by 3 desc ?
--
ac

 hai provato order by 3 desc ?
eh eh, ci avevo pensato anche io ma viene ignorato completamente.
:-)


 
Che lo ignori, come diceva il grande Gassman(*), mi puo' anche stare 
bene. Sai il perche'?
(*) Ma tu guarda se un grande attore deve essere ricordato per la 
pubblicita' fatta per una banca! Me ne vergogno profondamente.
--
ac

 bene. Sai il perche'?
esattamente no, immagino che il motivo sia lo stesso che non fa funzionare
la prima query suggerita ad Alex, ovvero Query Optimizer scarso
:-)
Ciao


Si infatti ho usato poca fantasia visto che Maurizio ha fatto un'ottimo
lavoro...!
Ho risparmiato.
@Alex

Bella soluzione anche questa...., non l'avrei mai trovata.
Nell'attesa di A2007, uso la soluzione che mi hai dato precedentemente
come dicevo
che, come giustamente mi hai fatto notare, espone solo i Records
visitati.
Grazie.
@Alex