28 messaggi dal 17 novembre 2005
ragazzi aiuto!
ho una query di access che utilizza la funzione LAST e funzia a dovere..
in sql sto impazzendo per ottenere la stessa cosa ma non riesco..
semplifico i dati che riporto qui sotto.

COMUNE DI MILANO -Sede Generale -2C100
COMUNE DI MILANO -Piazza - 2 C101

come accidenti posso selezionare la riga che ha l'ultimo valore = a 1?
i campi sono :
comune
riferimento
fase
sezione
progressivo
revisione

comune, riferimento, fase, sezione e progressivo sono raggruppati.
la revisione è un numero che va da 0 a n.
come posso visualizzare solo le righe prendendo il numero di revisione + alto e trascurando le altre?

spero di essere stato chiaro!

grazie a tutti!
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
magnetica wrote:
ragazzi aiuto!
ho una query di access che utilizza la funzione LAST e funzia a dovere.. in sql sto impazzendo per ottenere la stessa cosa ma non riesco.. semplifico i dati che riporto qui sotto.

COMUNE DI MILANO - Sede Generale - 2 C 10 0
COMUNE DI MILANO - Piazza - 2 C 10 1

come accidenti posso selezionare la riga che ha l'ultimo valore = a 1? i campi sono :
comune
riferimento
fase
sezione
progressivo
revisione

comune, riferimento, fase, sezione e progressivo sono raggruppati. la revisione è un numero che va da 0 a n.
come posso visualizzare solo le righe prendendo il numero di revisione + alto e trascurando le altre?

ho delle perplessita' sull'attributo [Progressivo], che progressivo non mi pare
ed anche su [Riferimento], che, nel tuo esempio, raggruppato non sembra, ed infatti l'ho rimosso dall'aggregazione.. potresti pero' scrivere qualche cosa simile a

SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.T (
Comune varchar(20) NOT NULL,
Riferimento varchar(20) NOT NULL,
Fase int NOT NULL,
Sezione char(1) NOT NULL,
Progressivo int NOT NULL,
Revisione int NOT NULL
);
GO
INSERT INTO dbo.T VALUES ( 'COMUNE DI MILANO', 'Sede generale', 2, 'C', 10, 0 );
INSERT INTO dbo.T VALUES ( 'COMUNE DI MILANO', 'Piazza', 2, 'C', 10, 1 ); GO
SELECT t.Comune, t.Fase, t.Sezione, t.Progressivo,
( SELECT MAX(t2.Revisione)
FROM dbo.T t2
WHERE t2.Comune = t.Comune
AND t2.Fase = t.Fase
AND t2.Sezione = t.Sezione
AND t2.Progressivo = t.Progressivo
) AS [Revisione calcolata]
FROM dbo.T t
GROUP BY t.Comune, t.Fase, t.Sezione, t.Progressivo;

GO
DROP TABLE dbo.T;
--<--------
Comune Fase Sezione Progressivo Revisione calcolata ------------------
---------
-----
---------
-----------------
COMUNE DI MILANO 2 C 10 1

saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
28 messaggi dal 17 novembre 2005
faccio subito esperimenti!

i valori sono raggruppati e le 2 righe vengono estratte separate perchè i valori RIFERIMENTO e REVISIONE differiscono dal resto.

so che non sono stato brillante nella spiegazione

domanda: le istruzioni SQL le posso utilizzare anche come dataset di un report di reporting services?
perchè la stessa query mi servirà anche per stampare un benedetto report..

non ho ancora molta esperienza in .NET e RS di SQL2005

grazie per l'aiuto!

ciao
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
magnetica wrote:
faccio subito esperimenti!

i valori sono raggruppati e le 2 righe vengono estratte separate perchè i valori RIFERIMENTO e REVISIONE differiscono dal resto.
so che non sono stato brillante nella spiegazione

domanda: le istruzioni SQL le posso utilizzare anche come dataset di un report di reporting services?
perchè la stessa query mi servirà anche per stampare un benedetto report..

il resultset restituito puo' ovviamente essere il loader di un dataset.. saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
28 messaggi dal 17 novembre 2005
ho provato a smanettare con la query che mi hai dato adattandola alle N tabelle coinvolte.
purtroppo non funziona..

questo perchè nella tua non hai considerato il campo RIFERIMENTO che varia mentre gli altri restano costanti.

la query sarebbe:

SELECT t.Comune, t.riferimento, t.Fase, t.Sezione, t.Progressivo,
( SELECT MAX(t2.Revisione)
FROM dbo.T t2
WHERE t2.Comune = t.Comune
AND t2.Fase = t.Fase
AND t2.Sezione = t.Sezione
AND t2.Progressivo = t.Progressivo
) AS [Revisione calcolata]
FROM dbo.T t
GROUP BY t.Comune, t.riferimento, t.Fase, t.Sezione, t.Progressivo;

cosi ti estrare cmq le 2 righe, quella con la revisione 0 e quella con la 1.
la prima con un riferiento, l'altra con un'altro.

spero di essermi "capito" :)
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
magnetica wrote:
ho provato a smanettare con la query che mi hai dato adattandola alle N tabelle coinvolte.
purtroppo non funziona..

questo perchè nella tua non hai considerato il campo RIFERIMENTO che varia mentre gli altri restano costanti.

la query sarebbe:

SELECT t.Comune, t.riferimento, t.Fase, t.Sezione, t.Progressivo, ( SELECT MAX(t2.Revisione)
FROM dbo.T t2
WHERE t2.Comune = t.Comune
AND t2.Fase = t.Fase
AND t2.Sezione = t.Sezione
AND t2.Progressivo = t.Progressivo
) AS [Revisione calcolata]
FROM dbo.T t
GROUP BY t.Comune, t.riferimento, t.Fase, t.Sezione, t.Progressivo;
cosi ti estrare cmq le 2 righe, quella con la revisione 0 e quella con la 1.
la prima con un riferiento, l'altra con un'altro.

spero di essermi "capito"

ok... io avevo capito che fossero "la stessa cosa" e avevo preso il "Piazza" <> "Sede Centrale" come un refuso, e per quello ho tolto quell'attributo dall'aggregazione..
bene
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
28 messaggi dal 17 novembre 2005
purtroppo no..
suggerimenti per risolvere la cosa?

la query in MS Access funziona perfettamente, porca miseria!!!

eccola in forma completa con tutte le tabelle coinvolte.
usando la funzione LAST riesco ad ottenere quello che voglio.
impossibile che non si possa fare anche in SQL Server.. ekkekkakkio!



SELECT dbo_anagrafiche.rag_sociale, Last(dbo_contatti.cognome) AS UltimoDicognome, Last(dbo_prot_registro.prot_numero) AS UltimoDiprot_numero, Last(dbo_prot_registro.data_inserimento) AS UltimoDidata_inserimento, Last(dbo_prot_intestatari.copie_c) AS UltimoDicopie_c, Last(dbo_prot_intestatari.copie_m) AS UltimoDicopie_m, Last(dbo_prot_mezzoinvio.sigla) AS UltimoDisigla, Last(dbo_com_doc_emessi.codifica) AS UltimoDicodifica, dbo_com_registro.numero, dbo_com_doc_emessi.cod_fase, dbo_com_doc_emessi.cod_sezione, dbo_com_doc_emessi.cod_progressivo, Max(dbo_com_doc_emessi.cod_revisione) AS MaxDicod_revisione, Last(dbo_com_doc_emessi.nomefile) AS UltimoDinomefile, Last(dbo_prot_registro.data_ricevimento) AS UltimoDidata_ricevimento, Last(dbo_com_doc_emessi.oggetto) AS UltimoDioggetto, Last(dbo_prot_doc_trasmessi.tipo) AS UltimoDitipo, Last(dbo_prot_doc_ricevuti.oggetto) AS UltimoDioggetto1, Last(dbo_com_fasi.descrizione) AS UltimoDidescrizione
FROM ((((((((dbo_prot_doc_trasmessi INNER JOIN dbo_prot_doc_ricevuti ON dbo_prot_doc_trasmessi.documento_ricevuto = dbo_prot_doc_ricevuti.id) INNER JOIN dbo_com_doc_emessi ON dbo_prot_doc_trasmessi.documento = dbo_com_doc_emessi.id) INNER JOIN dbo_com_fasi ON dbo_com_doc_emessi.cod_fase = dbo_com_fasi.codice) INNER JOIN dbo_prot_registro ON dbo_prot_doc_trasmessi.id_protocollo = dbo_prot_registro.ID) INNER JOIN dbo_com_registro ON dbo_prot_registro.id_commessa = dbo_com_registro.id) INNER JOIN dbo_prot_intestatari ON dbo_prot_registro.ID = dbo_prot_intestatari.id_protocollo) INNER JOIN dbo_prot_mezzoinvio ON dbo_prot_intestatari.id_mezzoinvio = dbo_prot_mezzoinvio.id) INNER JOIN dbo_contatti ON dbo_prot_intestatari.id_contatto = dbo_contatti.id) INNER JOIN dbo_anagrafiche ON dbo_contatti.id_anagrafica = dbo_anagrafiche.id
WHERE (((dbo_prot_registro.id_commessa)=122) AND ((dbo_prot_registro.tipo)="trasmesso"))
GROUP BY dbo_anagrafiche.rag_sociale, dbo_com_registro.numero, dbo_com_doc_emessi.cod_fase, dbo_com_doc_emessi.cod_sezione, dbo_com_doc_emessi.cod_progressivo
ORDER BY dbo_anagrafiche.rag_sociale, dbo_com_registro.numero, dbo_com_doc_emessi.cod_fase, dbo_com_doc_emessi.cod_sezione, dbo_com_doc_emessi.cod_progressivo, Max(dbo_com_doc_emessi.cod_revisione);

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.