Newsgroup: it.comp.appl.access
Titolo: Query di selezione un po' complicata

Il problema è questo:
Ho una tabella, chiamata "tabella1", tipo:
      NOME
     GIORNO
     STATUS
      Mario
     01/01/2004
     1
      Mario
     02/01/2004
     1
      Mario
     03/01/2004
     0
      Mario
     04/01/2004
     0
      Mario
     05/01/2004
     0
      Luca
     01/01/2004
     0
      Luca
     02/01/2004
     1
      Luca
     03/01/2004
     1
      Luca
     04/01/2004
     1
      Luca
     05/01/2004
     0
per il primo nome (Mario) ci sono 5 giorni, poi il conto ricomincia per il
secondo nome e così via, il campo "status" è booleano dove 1 sta per vero e
0 sta per falso.
Se io voglio l'elenco dei "nomi" e il "giorno" dove "status" è vero la query
è molto semplice, quasi ridicola:
SELECT giorno, nome FROM tabella1 WHERE status = true
ottengo:
      NOME
     GIORNO
     STATUS
      Mario
     01/02/2004
     1
      Mario
     02/01/2004
     1
      Luca
     02/01/2004
     1
      Luca
     03/01/2004
     1
      Luca
     04/01/2004
     1
fin qui tutto semplice.
Ma io voglio che, sempre mantenendo la condizione "status = true", per ogni
nome, se nel primo record (in parole povere quello in corrispondenza della
data 01/01/2004) lo "status" è false, al posto del nome mi scriva un'altra
cosa (ad esempio "Nessun nome").
Nella tabella d'esempio il primo record di Mario è true, quindi il problema
non si presenta. Ma il primo record di Luca è false, per cui il risultato
che voglio ottenere è il seguente:
      NOME
     GIORNO
     STATUS
      Mario
     01/02/2004
     1
      Mario
     02/01/2004
     1
      Nessun nome
     01/01/2004
     0
      Luca
     02/01/2004
     1
      Luca
     03/01/2004
     1
      Luca
     04/01/2004
     1
E' possibile con una query di selezione? Io mi sono perso in mezzo agli IIF
e non riesco a venirne a capo.
Ma soprattutto, si capisce quello che voglio?
Grazie per l'aiuto.

Ri-posto perché nel primo è venuta una fetenzìa!!
Il problema è questo:
Ho una tabella, chiamata "tabella1", tipo:
      NOME     GIORNO     STATUS
      Mario     01/01/2004     1
      Mario     02/01/2004     1
      Mario     03/01/2004     0
      Mario     04/01/2004     0
      Mario     05/01/2004     0
      Luca       01/01/2004     0
      Luca       02/01/2004     1
      Luca       03/01/2004     1
      Luca       04/01/2004     1
      Luca       05/01/2004     0
per il primo nome (Mario) ci sono 5 giorni, poi il conto ricomincia per il
secondo nome e così via, il campo "status" è booleano dove 1 sta per vero e
0 sta per falso.
Se io voglio l'elenco dei "nomi" e il "giorno" dove "status" è vero la query
è molto semplice, quasi ridicola:
SELECT giorno, nome FROM tabella1 WHERE status = true
ottengo:
      NOME     GIORNO     STATUS
      Mario     01/01/2004     1
      Mario     02/01/2004     1
      Luca       02/01/2004     1
      Luca       03/01/2004     1
      Luca       04/01/2004     1
fin qui tutto semplice.
Ma io voglio che, sempre mantenendo la condizione "status = true", per ogni
nome, se nel primo record (in parole povere quello in corrispondenza della
data 01/01/2004) lo "status" è false, al posto del nome mi scriva un'altra
cosa (ad esempio "***").
Nella tabella d'esempio il primo record di Mario è true, quindi il problema
non si presenta. Ma il primo record di Luca è false, per cui il risultato
che voglio ottenere è il seguente:
      Mario     01/01/2004     1
      Mario     02/01/2004     1
      ***        01/01/2004     0


 ha scritto nel messaggio
news:Y_Otc.78243$Qc.31...@twister1.libero.it...

Non so se ho ben capito...ma mi sembra troppo semplice:
SELECT IIf([Status]=False,"****",[Nome]) AS MioNome, Tabella1.Giorno,
Tabella1.Status
FROM Tabella1;
Ciao, Carlo

 ha scritto nel
messaggio news:x1Wtc.256863$hc5.11...@news3.tin.it...

Grazie per la risposta Carlo.
In effetti hai ragione a dire che ti sembrava troppo semplice :)
Questo è uno dei tentativi che ho fatto anch'io, solo che il risultato è:
       Mario     01/01/2004     1
       Mario     02/01/2004     1
       ***        03/01/2004     0
       ***        04/01/2004     0
       ***        05/01/2004     0
       ***        01/01/2004     0
       Luca       02/01/2004     1
       Luca       03/01/2004     1
       Luca       04/01/2004     1
       ***        05/01/2004     0
e non:
       Mario     01/01/2004     1
       Mario     02/01/2004     1
       ***        01/01/2004     0
       Luca       02/01/2004     1
       Luca       03/01/2004     1
       Luca       04/01/2004     1
ovvero tutti i record vengono presi in considerazione (status=false e
status=true) e, giustamente, in caso di "false", il nome cambia in "***". Ma
io voglio che solo il primo record (quello con data 01/01/2004, per
intenderci) di ogni nome subisca l'eventuale variazione.
Mi sono spiegato?


sě, si capisce perfettamente, prova cosě
-------------------------
SELECT IIF('' & T2.Nome<>'' AND Status=0,'****',T1.Nome) AS NewNome,
            T1.Giorno,T1.Status
FROM Tabella1 AS T1
  LEFT JOIN (SELECT Nome,MIN(Giorno) AS MinGiorno
                       FROM Tabella1 GROUP By Nome) AS T2
  ON T1.Nome=T2.Nome AND T1.Giorno=T2.MinGiorno
--------------------------
Ciao Giorgio


acc! ho dimenticato che non vuoi vedere le righe con status=0 e no primo
giorno, poco male basta aggiungere una WHERE
----------------------------------
SELECT IIF('' & T2.Nome<>'' AND Status=0,'****',T1.Nome) AS NewNome,
            T1.Giorno,T1.Status
FROM Tabella1 AS T1
  LEFT JOIN (SELECT Nome,MIN(Giorno) AS MinGiorno
                       FROM Tabella1 GROUP By Nome) AS T2
  ON T1.Nome=T2.Nome AND T1.Giorno=T2.MinGiorno
WHERE Status=1 OR T2.Nome IS NOT NULL AND Status=0
---------------------------------
Ciao Giorgio

 ha scritto nel
messaggio news:c9apfv$1l0$1...@lacerta.tiscalinet.it...

Grazie dell'aiuto Giorgio, ma c'č ancora un problema. Senza clausola WHERE
il risultato č questo:
    NEWNAME    GIORNO        STATUS
    Mario                01/01/2004        1
    Mario                02/01/2004        1
    Mario                03/01/2004        0
    Mario                04/01/2004        0
    Mario                05/01/2004        0
    ****                 01/01/2004        0
    Luca                  02/01/2004        1
    Luca                  03/01/2004        1
    Luca                  04/01/2004        1
    Luca                  05/01/2004        0
Con la clausola:
    NEWNAME    GIORNO        STATUS
    ****                01/01/2004            0
Io ho provato a modificare la tua query, ma č come se l'elettrauto sotto
casa mia tentasse di riparare il quadro comandi dello shuttle!!

 ha scritto nel messaggio
news:nLDuc.82678$Qc.32...@twister1.libero.it...

Ciao,
controlla bene, a me da questo risultato
------------------------
NewNome Giorno Status
--------------------------
Mario 01/01/2004 1
Mario 02/01/2004 1
**** 01/01/2004 0
Luca 02/01/2004 1
Luca 03/01/2004 1
Luca 04/01/2004 1
-------------------------
Visto che ho creato la tabella, inserito i dati e costruito la query se vuoi
di mando un Db in Acc2000 con l'esempio
Ciao Giorgio

 Ciao Giorgio
Non capisco, eppure faccio copia/incolla e anche controllando parola per
parola la query è identica; solo il risultato è diverso.
Se puoi mandarmi il db di esempio, a questo punto...
Il mio indirizzo è 
frig...@libero.it
.
Ancora grazie.

 Ancora grazie.
fatto, poi mi spiegherai perchè a te non funziona :-)
Ciao Giorgio