Funzioni mix max (scusate...è urgente)

martedì 15 marzo 2011 - 16.35
Tag Elenco Tags  SQL Server 2008  |  SQL Server 2005

bolla111 Profilo | Senior Member

ringrazio in anticipo a chi mi darà aiuto

ho misogno di fare una query su una tabella che prenda il valore minimo del campo data e il valore di un campo stringa corrispondente a quel record, la stessa query deve prendere il valore massimo dello stesso campo data e lo campo stringa corrispondente a quel valore, in + altri vari campi..

come posso fare?

ma_di Profilo | Junior Member

>ringrazio in anticipo a chi mi darà aiuto
>
>ho misogno di fare una query su una tabella che prenda il valore
>minimo del campo data e il valore di un campo stringa corrispondente
>a quel record, la stessa query deve prendere il valore massimo
>dello stesso campo data e lo campo stringa corrispondente a quel
>valore, in + altri vari campi..
>
>come posso fare?
Ciao,
può sembrare banale... ma una query con select max(data), ecc order by data asc e poi la stessa ma con order by data desc
potrebbe essere il tuo caso?

bolla111 Profilo | Senior Member

non credo...perchè non mi interessa l'ordinamento x data...ma visualizzare una serie di record che prendo do una tabella dove ho un campo data e un campo stringa...
io devo visualizzare in un altra tabella la data maggiore con il campo stringa associato e il campo data minore con il campo stringa associato:
esempio:

data inizio | descrizione iniziale | data fine | descrizione finale | dato1 | dato2 | ecc

data inizio e data fine sono il campo data1(max e min) della tabella1
descrizione iniziale e descrizione finale sono il campo descrizione1 della tabella1

sono riuscito a spiegarmi?

lbenaglia Profilo | Guru

>come posso fare?

Ciao Fabio,

Posta un esempio con la struttura della tabella (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il result set atteso con quei dati.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

bolla111 Profilo | Senior Member

posto solo l'essenziale se no non finisco +

ho una tabella TDDocumento che si lega alla tabella TDVersione tramite l'id del documento (DOCID)
praticamente la tabella versioni rappresenta le diverse versioni di un documento

la tabella TDVersione è formata da VRID(int), VRDOCID(int), VRDATA(date), VRUTID(id) (id dell'utente che crea la versione, è legato alla tabella utenti)

record di esempio

VRID | VRDOCID | VRDATA | VRUTID | atri campi 1 1 2011-03-10 1 bla 2 1 2011-03-12 4 bla 3 1 2011-03-15 5 bla

ciò che voglio visualizzare in una query è:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

lbenaglia Profilo | Guru

>posto solo l'essenziale se no non finisco +
Purtroppo senza le informazioni COMPLETE delle tabelle, dei dati di esempio e del result set COMPLETO che intendi ottenere ogni soluzione proposta sarebbe del tutto inutile dato che non funzionerebbe nel caso reale.
Se desideri ricevere aiuto posta i dati che ti ho chiesto (CREATE TABLE, comandi di INSERT e result set atteso con quei dati).

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

bolla111 Profilo | Senior Member

scusa se insisto...
cmq non è che sono proprio negato...se riesci a darmi una soluzione per quei dati che ti ho inviato poi io saprei adattarla alle mie esigenze...
quello che mancherebbe sarebbero soltanto tutti quei campi che ho definito "altri campi"

cosa intendi x result set? cosa devo postarti?


grazie

lbenaglia Profilo | Guru

>scusa se insisto...
>cmq non è che sono proprio negato...se riesci a darmi una soluzione
>per quei dati che ti ho inviato poi io saprei adattarla alle
>mie esigenze...
Non lo metto in dubbio, ma permettimi invece di dubitare del fatto che le query con molta probabilità andrebbero stravolte dato che anche se a te non sembra può cambiare totalmente la logica di estrazione.

>quello che mancherebbe sarebbero soltanto tutti quei campi che
>ho definito "altri campi"
E dici poco?

>cosa intendi x result set?
Un result set è l'elenco delle righe restituite da un comando di SELECT.

>cosa devo postarti?
Semplicemente quello che ti ho chiesto.

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

bolla111 Profilo | Senior Member

CREATE TABLE [dbo].[TDPreventivi](
[PRId] [int] NULL,
[PRCLId] [int] NULL,
[PRDestinazione] [varchar](100) NULL,
[PRNomePreventivo] [varchar](50) NULL,
[PRTPId] [int] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[TDVersioni](
[VRIdGen] [int] NULL,
[VRPRId] [int] NULL,
[VRId] [int] NULL,
[VRUTId] [int] NULL,
[VRData] [date] NULL,
[VROra] [time](6) NULL,
[VRDataPartenza] [varchar](50) NULL,
[VRNumPasseg] [int] NULL,
[VRGiorni] [int] NULL,
[VRNotti] [int] NULL,
[VRCEE] [bit] NULL,
[VRImporto] [decimal](15, 2) NULL
) ON [PRIMARY]

ogni preventivo ha tot versioni


devo visualizzare:
PRId
data versione iniziale (min VRData )
VRUTId (corrispondente al min vrdata)
versione recente ( VRId corrispondente al max vrdata)
data versione recente (max VRData)
VRUTId (corrispondente al max vrdata)
PRCLId
PRNomePreventivo
PRDestinazione
accorpamento campi VRGiorni / VRNotti (corrispondenti al max vrdata)


ti serve altro?

lbenaglia Profilo | Guru

>ti serve altro?
I comandi di INSERT ed il result set in forma tabulare in base a quei dati.
Tanto per farti un esempio qualcosa di simile al codice riportato nel mio post in questo thread:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=38554

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

bolla111 Profilo | Senior Member

INSERT INTO [DbTravelDesPrev].[dbo].[TDPreventivi]
([PRId]
,[PRCLId]
,[PRDestinazione]
,[PRNomePreventivo]
,[PRTPId])
VALUES
(1,1,'Canarie','Bello_Canar_Agost',1),
(2,3,'Baleari','Clien_Balea_Lugli',1)


INSERT INTO [DbTravelDesPrev].[dbo].[TDVersioni]
([VRIdGen]
,[VRPRId]
,[VRId]
,[VRUTId]
,[VRData]
,[VROra]
,[VRDataPartenza]
,[VRNumPasseg]
,[VRGiorni]
,[VRNotti]
,[VRCEE]
,[VRImporto])
VALUES
(1,1,1,1,2011-03-10,'15:30:00','Agosto',2,8,7,'False',2200.00),
(2,1,2,4,2011-03-15,'17:00:00','Agosto',3,8,7,'False',3300.00),
(3,2,1,5,2011-03-12,'16:00:00','Luglio',4,8,7,'False',4000.00)


result set:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

prid=vrprid
G/N = accorpamento VRGiorni+/+VRNotti (relativi alla versione + recente)

utente iniziale associato praticamente alla vrdata min, versione recente e utente recente associati alla vrdata max
record possibilmente ordinati per vrdata (data versione recente)

manca qualcosa?
mi sono spiegato?



se dovesse essere una query impossibile avevo pensato di crearne una senza inserire utente iniziale e data versione iniziale, aggiungendole poi da una seconda query e facendo un ciclo nel mio programma... potrebbe essere una soluzione + valida così?

bolla111 Profilo | Senior Member

nessun aiuto?

sansi Profilo | Newbie

Un'idea potrebbe essere (se qualcuno ha una proposta più semplice è ben accetta):

creare una select per ottenere la data minima di ciascun documento

SELECT MIN(VRDATA) AS DATAINIZIO, VRDOCID FROM [dbo].[TDPreventivi] GROUP BY VRDOCID a cui assegnare un alias e fare la stessa cosa per ottenere il max, poi unire i due dataset così ottenuti

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

a questo punto hai un dataset con l'id del documento, la data inizio e la data fine che a sua volta puoi unire ancora con la tabella TDPreventivi

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

in questo modo hai tutti i dati della tabella TDPreventivi relativi alla data inizio. Con un'ulteriore join su un'altra istanza (es. PREVENTIVI2) di TDPreventivi ON TMP.VRDOCID= PREVENTIVI2.VRDOCID AND TMP.DATAFINE= PREVENTIVI2.VRDATA dovresti ottenere quello che ti serve
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Scusami ma non ho avuto tempo di testare la sintassi, quindi non so se è corretta. Spero, comunque, di averti dato un'idea.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5