Newsgroup: it.comp.appl.access
Titolo: Query particolare

ciao a tutti,
ho una tabellla con la seguente struttura:
 
ID_CLIENTE   SETTIMANA   COMMENTO
 
ho bisogno di generare una query in cui selezionando una settimana e un cliente mi restituisce qualcosa del genere:
 
IDCLIENTE COMMENTWKSELEZIONATa   COMMENTOWK-1  COMMENTOWK-2
 
in pratica mi prende i commenti della week attuale e, solo se ci sono, quelli fino a 2 week precedenti (può essere non presente il commentoWK-1 o CommentoWK-2).
Ho provato a fare una query con un join sulla stessa tabella ma il risultato è che se non sono presenti commenti nella week precedente la query è vuota (anche cambiando tipo di join).
grazie

Assomiglia a una query a CampiIncrociati,
ma facci capire bene....
 
ogni settimana 
   - hai sempre 2 commenti
   - puoi avere al massimo 2 commenti
   - puoi avere da zero a n commenti
 
per conseguenza quando selezioni la settimana e il cliento puoi:
   - hai sempre 2 campi
   - hai al massimo 2 campi
   - puoi avere da zero a n campi
   - puoi avere da zero a n campi ma ne evidenzi solo 2
 
- I nomi dei campi sono sempre fissi ?
 

ciao
come detto la tabella ha la seguente struttura, vi faccio anche un esempio:
ID_CLIENTE   SETTIMANA   COMMENTO 
222            201345     CIAO
222            201343     helloooo
 
In questo caso mi deve visualizzare:
 
ID_CLIENTE   COMMENTO WEEK 45     COMMENTO WEEK-1   COMMENTO week-2
222            CIAO                                      helloooo
 
la colonna week-1 essendo vuota può anche non comparire
 
spero sia stato chiaro

> spero sia stato chiaro
 
Non molto,  se mi permetti provo a ripetere quello che ho capito
( Usando dei nomi campi stilizzati )
 
IdCli ------ Setti --------- Comme
222 -------- 201343 -------- c22243
222 -------- 201345 -------- c22245
222 -------- 201340 -------- c22240
222 -------- 201346 -------- c22246
224 -------- 201345 -------- c22445
224 -------- 201342 -------- c22442
dove 
il cliente ammette duplicati
Per ogni cliente puoi avere Max 1 Commento alla settimana  ( dammi conferma )
 
 
 
Poi dopo avere selezionato "IdCli"=222 e "Setti"=201345
vuoi arrivare a questo risultato
IdCli ------- ComSet45 ------- Com1 ------ Com2
222 --------- c22245 --------- c22243 ---- c22240
 
 
in effetti ( come da titilo ) si tratta di una query perticolare
---- ( non ti chiedo il senso .... )
il nome del secondo campo viene prelevato dal filtro
poi altri 2 ( soli ??? ) campi di commento con nomi generici
 
 
Dacci certezza di quanto sopra che poi vediamo cosa esce dal 
nostro povero e vecchio cervellino
 

ciao
per 1 cliente puoi avere 1 commento/settimana (chiave primaria IDCLI-WEEK)
per il resto hai centrato perfettamente.L'intestazione colonna della query finale non è importante (possiamo imporre noi i nomi o come vuoi) cmq la struttura che hai riportato è qualla di cui ho bisogno..
non mi chiedere a cosa serve.. forse non l'ho capito neanche io...me l'hanno chiesta
grazie mille

Confesso che non sono sicuro,  e devo scappare.
 
ma cosi in minuta direi che se hai una tabella:
di nome "Tabe"
con i campi
IdCli -- Numerico
Setti -- Testo
Comme -- Testo
 
con questa query sei quasi arrivato
 
 
SELECT Q1.IdCli, Q1.Setti, IIf([Contx]=0,[Comme]) AS Co0, IIf([Contx]=1,(Comme]) AS Co1, IIf([Contx]=2,[Comme]) AS Co2
FROM (SELECT T1.IdCli, T1.Setti, T1.Comme, IIf([T1].[Setti]=[NSettimana],0,((SELECT Count(T2.Setti) FROM (SELECT T0.IdCli, T0.Setti FROM Tabe AS T0 WHERE T0.Setti<>[NSettimana]) AS T2 WHERE ((T2.IdCli=[NCliente]) AND (T2.Setti<T1.Setti)))+1)) AS Contx
FROM Tabe AS T1
WHERE (((T1.IdCli)=[NCliente]))
) AS Q1;
 
 
 
 
Dovrai aggiustarti qualche parentesi,  mi aspettano.....
 
 
 
 

infatti,   avevo troppa fretta e non funziona.
 
posto le 3 query elementari che compongono la soluzione ( speriamo ) 
in modo che puoi capirla e personalizzarla.
 
Tieni presente che è molto migliorabile e che se hai molti record penso che sia un po pesante
 
Potresti anche usare VBA ......
 
Data la tabella descritta sopra
 
fai una prima query di nome "Q1"
SELECT 
T1.IdCli, 
T1.Setti, 
T1.Comme, 
IIf([T1].[Setti]=[NSettimana],1,(
   (SELECT Count(T2.Setti) FROM 
      (
	  SELECT T0.IdCli, T0.Setti FROM Tabe AS T0 WHERE T0.Setti<>[NSettimana]
	  ) AS T2 
	  WHERE ((T2.IdCli=[NCliente]) AND (T2.Setti<T1.Setti))
	)+2
)) AS Contx
FROM 
Tabe AS T1
WHERE (((T1.IdCli)=[NCliente]))
;
 
poi fai una seconda query di nome "Q2"
SELECT 
Q1.IdCli, 
[NSettimana] AS Settim, 
IIf([Q1].[Contx]=1,[Q1].[Comme]) AS Com1, 
IIf([Q1].[Contx]=2,[Q1].[Comme]) AS Com2, 
IIf([Q1].[Contx]=3,[Q1].[Comme]) AS Com3
FROM 
Q1
;
 
Poi fai una terza query chiamala come vuoi te
SELECT 
Q2.IdCli, 
Q2.Settim, 
Max(Q2.Com1) AS Comm1, 
Max(Q2.Com2) AS Comm2, 
Max(Q2.Com3) AS Comm3 
FROM 
Q2
GROUP BY Q2.IdCli, 
Q2.Settim
;
 
 
 
Se invece la preferisci ( ma lo sconsiglio ) in una unica query
tutta accorpata allora duventa:
SELECT 
Q2.IdCli, 
Q2.Settim, 
Max(Q2.Com1) AS Comm1, 
Max(Q2.Com2) AS Comm2, 
Max(Q2.Com3) AS Comm3 
FROM 
(
SELECT 
Q1.IdCli, 
[NSettimana] AS Settim, 
IIf([Q1].[Contx]=1,[Q1].[Comme]) AS Com1, 
IIf([Q1].[Contx]=2,[Q1].[Comme]) AS Com2, 
IIf([Q1].[Contx]=3,[Q1].[Comme]) AS Com3
FROM
(
SELECT 
T1.IdCli, 
T1.Setti, 
T1.Comme, 
IIf([T1].[Setti]=[NSettimana],1,(
   (SELECT Count(T2.Setti) FROM 
      (
	  SELECT T0.IdCli, T0.Setti FROM Tabe AS T0 WHERE T0.Setti<>[NSettimana]
	  ) AS T2 
	  WHERE ((T2.IdCli=[NCliente]) AND (T2.Setti<T1.Setti))
	)+2
)) AS Contx
FROM 
Tabe AS T1
WHERE (((T1.IdCli)=[NCliente]))
) AS Q1
) AS Q2
GROUP BY Q2.IdCli, 
Q2.Settim
;

 222 --------- c22245 --------- c22243 ---- c22240
Scusa se m'intrometto, ma l'OP non aveva detto:
"i commenti della week attuale e, solo se ci sono,
quelli fino a 2 week precedenti"
???
 
Se così fosse nell'esempio su esposto esiste solo il
primo commento precedente (Com1) e non anche il secondo
precedente (Com2).
 
Potrei anche aver preso fiaschi per fischi (che è sempre
la cosa migliore!)...
 
Bruno
 
 

 la cosa migliore!)...
 
Arrrrgh!
Vedo adesso che le settimane non sono ordinate... come non detto.
 
Bruno
 
 

 quelli fino a 2 week precedenti"
 
No non ti intrometti
 
In effetti mi rendo conto di avere fatto un errore,
mi era sfuggito quella dei "2 week precedenti"
e io gli ho selezionato:
- La settimana attuale
- La prima in assoluto ( ad esclusione della attuale )
- La seconda in assoluto ( sempre ad esclusione della attuale )
 
 
Resterei in attesa di AlexB per eventuali altre osservazioni
 
 
 
Comunque una cosa simile la farei molto piu volentieri con VBA
 
 

Mancini explained :

Eccola qua:
 
==============================================
Public Sub ParticularSearch()
Dim SQL As String, RS As Recordset, IdCli As Long, Setti As String
Dim S(0 To 2) As String, i As Long, SS As String
 
'----   Definizioni   ------
IdCli = 222
Setti = "201345"
'---------------------------
 
SQL = "SELECT Tabe.IdCli, Tabe.Setti, Tabe.Comme "
SQL = SQL & "FROM Tabe ORDER BY Tabe.IdCli, Tabe.Setti;"
Set RS = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
 
For i = 0 To 2
    S(i) = "--   ---   ------   ------"
Next
 
Do Until RS("IdCli") = IdCli And RS("Setti") = Setti
    RS.MoveNext
Loop
 
S(0) = " 0   " & RS("IdCli") & "   " & RS("Setti") & "   " & 
RS("Comme")
For i = 1 To 2
    RS.MovePrevious
    If Not RS.BOF Then
        S(i) = "-" & i & "   " & RS("IdCli") & "   " & RS("Setti") & "  
 " & RS("Comme")
    End If
Next
 
For i = 2 To 0 Step -1
    SS = SS & S(i) & vbCrLf
    'Debug.Print S(i)
Next
MsgBox SS
 
End Sub
================================================
 
Bruno
 
 

 > Eccola qua:
si bella ...
 
una alternativa senza query potrebbe essere:
 
(NB: Non sto dicendo che una è meglio dell'altra, 
ma per nostra comune "cultura" e "diletto" troviamo strade diverse )
 
 
 
Public Sub Mancio2()
 
' Definizione del cliente
Dim CCC As Integer
CCC = 222
 
' Definizione della settimana  ( 1° settimana )
Dim SS1 As String
SS1 = "201345"
 
'  la prima settimana precedente ( ( 2° settimana)
Dim SS2 As String
SS2 = Nz((DMax("Tabe.Setti", "Tabe", "Tabe.IdCli=" & CCC & " And Tabe.Setti<'" & SS1 & "'")), "")
 
'  la seconda settimana precedente ( ( 3° settimana)
Dim SS3 As String
SS3 = Nz((DMax("Tabe.Setti", "Tabe", "Tabe.IdCli=" & CCC & " And Tabe.Setti<'" & SS2 & "'")), "")
 
Dim RRR As String
RRR = ""
 
RRR = RRR & Left(("Cliente" & String(30, " ")), 30)
RRR = RRR & Left(("Sett1/" & SS1 & String(30, " ")), 30)
RRR = RRR & Left(("Sett2" & String(30, " ")), 30)
RRR = RRR & Left(("Sett3" & String(30, " ")), 30)
RRR = RRR & vbNewLine
RRR = RRR & Left((CCC & String(30, " ")), 30)
RRR = RRR & Left((DLookup("Tabe.Comme", "Tabe", "Tabe.IdCli=" & CCC & " And Tabe.Setti='" & SS1 & "'") & String(30, " ")), 30)
RRR = RRR & Left((DLookup("Tabe.Comme", "Tabe", "Tabe.IdCli=" & CCC & " And Tabe.Setti='" & SS2 & "'") & String(30, " ")), 30)
RRR = RRR & Left((DLookup("Tabe.Comme", "Tabe", "Tabe.IdCli=" & CCC & " And Tabe.Setti='" & SS3 & "'") & String(30, " ")), 30)
 
MsgBox RRR
 
End Sub
 
 
 

 ma per nostra comune "cultura" e "diletto" troviamo strade diverse )
Sono d'accordo, e sono d'accordo che si stabilisca inoltre una critica 
costruttiva.
 
E per cominciare con la critica - vorrai scusarmi! - ho subito da 
esporre che le Domain Function, nel codice VBA, proprio non le 
sopporto.
 
De gustibus...
 
Bruno
 
 

Beh!!  anche a me non è che mi siano simpatiche le funzioni di dominio
 
ma talvolta sono comode e immediate.
 
Su questo argomento apro una domanda specifica altrimenti usciamo
dalla domanda base di AlexB

ciao
vi ringrazio per le tante risposte e alternative. farò qualche prova e vi faccio sapere. la soluzione con il Vba mi sembra più immediata, ma preferivo una query perchè andrò a filtrare tanti clienti contemporaneamente. cmq vi farò sapere