Newsgroup: it.comp.appl.access
Titolo: query complessa

  L'obbiettivo è trovare l'uso (o litologia) più frequente, ovvero riuscire 
a passare dalla tabella q1 a quella q2 come risultato di una query complessa 
(che non sò fare).
  Q1 unita s_unita uso_del_suolo
      CIV 1 100
      CIV 1 100
      CIV 2 100
      LAV 1 200
      LAV 2 370
      LAV 1 270
      LAV 1 270
      LAV 1 270
      LAV 1 200
Q2
      unita s_unita uso_del_suolo
      CIV 1 100
      CIV 2 100
      LAV 1 270
      LAV 2 370
Per farlo attualmente eseguo tre query in fila (non nidificate!):
la prima raggruppa sui campi chiave e conteggia l'uso del suolo, la seconda 
seleziona solo i valori massimi, la terza esegue un inner join tra campi 
chiave (unita, s_unita) e valore massimo restituendone l'uso corrispondente.
sono convinto ci sia un metodo più elegante e funzionale per eseguire questa 
selezione, magari anche contemporaneamente su più campi (uso, lito, 
ecc...)...
scusate l'ignoranza,
sono convinto che studiando un pò di teoria vi risparmierei scocciature 
ma...
un aiuto a volte fà bene sia a chi lo riceve che a chi lo dà,
grazie ancora,
Giovanni 

 Giovanni
-- 
Roberto
-----------------------------------------------
il Sito Comune di it.comp.appl.access
http://www.sitocomune.com
-----------------------------------------------

 ha scritto nel messaggio 
news:de1Gf.165727$65.46...@twister1.libero.it...


 l'hai fatta troppo facile!
Io non l'ho fatta troppo facile, ho solamente letto il tuo messaggio in cui
tra l'altro dicevi:  "seleziona solo i valori massimi" senza spiegare i
valori massimi di che cosa; questa tua affermazione insieme al tuo esempio
di cosa volevi in Q2 ha lasciato intendere che ti riferissi ai valori
massimi di uso_del_suolo, quindi mi sento di dire che se io l'ho fatta
troppo facile certamente tu ti sei spiegato moooolto male. Resta il fatto
che la query che ti ho suggerito se applicata ai record  di Q1 del tuo
esempio restituiva i record di Q2 del tuo esempio.
Non usando una sfera di cristallo più di così non sono riuscito a fare.
Comunque, se il campo quantita è di tipo Testo mentre gli altri due campi
sono di tipo Numerico,  per risolvere il tuo problema due query sono più che
sufficienti: creati una query chiamata Query2 che abbia il seguente codice
SQL:
SELECT Q1.quantita, Q1.s_quantita, Q1.uso_del_suolo,
DCount("*","Q1","quantita ='" & [quantita] & "' And s_quantita =" &
[s_quantita] & " And uso_del_suolo=" & [uso_del_suolo]) AS Frequenza
FROM Q1
GROUP BY Q1.quantita, Q1.s_quantita, Q1.uso_del_suolo;
quindi su tale query creati la query che ti darà il risultato voluto e che
dovrà avere il seguente codice SQL:
SELECT Query2.quantita, Query2.s_quantita, Query2.uso_del_suolo
FROM Query2
WHERE (((Query2.Frequenza)=DMax("Frequenza","Query2","quantita = '" &
[quantita] & "' And s_quantita = " & [s_quantita])));
[CUT]


Dato che non sono stato abbastanza chiaro cercherò di esserlo di seguito:
Attualmente eseguo 4 query in pila che mi restituiscono il risultato cercato 
(ricorrenza più frequente!) per una sola delle 11 classi da sintetizzare. 
Ciò mi comporterebbe 44 query più almeno una di sintesi che crei un'unica 
tabella riassuntiva. i termini della questione sarebbero nidificare le 4 
query in modo da poterle eseguire per ognuno dei campi della t1 
contemporaneamente in un'unica grande query, magari su tutti e 11 i campi 
contemporaneamente.....
la q. 00 esclude il grado_corr "C"
        01 conteggia le ricorrenze per la classe Lito_sst
        02 trova quella più frequente per la classe Lito_sst
        03 riporta la litologia corrispondente alla più frequente ( o il 
primo in caso di parità) per la classe Lito_sst
in t1 i dati di origine, in Q_03_lito_risultato i risultati sperati per uno 
solo dei campi da calcolare:
sono convinto che sia possibile ma a me mancano le competenze come pure alle 
persone che ho contattato fin'ora.
per quel che ho visto visual basic (dcount, ecc.) rallenta il calcolo senza 
risolvere il problema
confido in voi!
grazie,
a dopo
Giovanni
t1
unita s_unita grado_corr uso_del_suolo vegetazione natuforhm2 elmordam2 lito 
origin Lito_sst Morfo_sst Usosuolo_sst pm_origine pm_compos
ABB 1 B 200 0 ELR VS 0 AM  EV 20 AM ACC
ABB 1 T 820 0 EDF V SE1108A 0 SE1108G EL 50 AM M
ABB 1 T 310 0 ELR VS 0 AM AMS EL 41  SGG
ABB 1 T 310 0 ELR VS SE1101 0  EV 41  C
ABB 2 B 730 B17 ED V SE1108G 0 SE1108G EV 61
ABB 3 B 820 0 EV VA SE1101 0 AMS EL 50 AMR G
ABB 3 R 200 0 ED V SE1101 0  EL 20  M
ABB 4 B 510 B01 EL VS SE1101 0 SE1101 EL 61 AM C
ABB 5 B 510 0 ELR VS SE1101 0 SE1101 EL 61  C
ABB 5 C 310 0 SS P SE1101 AMR  SS 41  M
ABB 5 C 370 0 ATD  SE1101 0  AT 43  S
AER 0 B 310 0 PC  0 AF AF FB 41 AF M
AGR 1 B 330 I01 FAA PP 0 AF    AF SCC
AGR 2 B 380 0 FAA PP 0 AF     S
AGR 4 B 200 0 PPC  0 AF    AF S
Q_00
SELECT t1.*
FROM t1
WHERE (((t1.grado_corr)<>"c"));
Q_01
SELECT q1.unita AS unita, q1.s_unita AS s_unita, Count(q1.Lito_sst) AS 
Fq_Lito_sst, q1.Lito_sst AS Lito_sst
FROM Q_siti_amb_00 AS q1
GROUP BY q1.unita, q1.s_unita, q1.Lito_sst
HAVING (((Count(q1.Lito_sst))>=1))
ORDER BY q1.unita, q1.s_unita, Count(q1.Lito_sst) DESC;
Q_02
SELECT Q_siti_amb_01_lito.unita, Q_siti_amb_01_lito.s_unita, 
Max(Q_siti_amb_01_lito.Fq_Lito_sst) AS MaxDiFq_Lito_sst
FROM Q_siti_amb_01_lito
GROUP BY Q_siti_amb_01_lito.unita, Q_siti_amb_01_lito.s_unita;
Q_03_lito_risultato:
SELECT Q_siti_amb_01_lito.unita, Q_siti_amb_01_lito.s_unita, 
First(Q_siti_amb_01_lito.Lito_sst) AS PrimoDiLito_sst
FROM Q_siti_amb_01_lito INNER JOIN Q_siti_amb_02_lito ON 
(Q_siti_amb_01_lito.Fq_Lito_sst = Q_siti_amb_02_lito.MaxDiFq_Lito_sst) AND 
(Q_siti_amb_01_lito.s_unita = Q_siti_amb_02_lito.s_unita) AND 
(Q_siti_amb_01_lito.unita = Q_siti_amb_02_lito.unita)
GROUP BY Q_siti_amb_01_lito.unita, Q_siti_amb_01_lito.s_unita;
Risultato
unita s_unita Lito_sst
ABB 1 AMS
ABB 2 SE1108G
ABB 3 AMS
ABB 4 SE1101
ABB 5 SE1101
AER 0 AF 

 ha scritto nel messaggio
news:dsclq3$2g0a$1...@newsreader1.mclink.it...

Mi dispiace, ma non riesco a capire cosa ti serve, quindi esco dal thread.
