Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Database con record valore massimo

    Salve a tutti. Piccolo problemino.
    Ho un database access con i seguenti campi :

    nome_azione - nome_offerta - valore_offerta - altro_campo
    fiat giovanni 10 yfuyf
    ferrari francesco 5 guogerh
    lancia giovanni 8 ugiugug
    ferrari giovanni 3 tdutdfu
    fiat ernesto 5 yfyfyf
    fiat giovanni 5 yfguyfyu

    come si vede per una stessa azione posso fare più offerte nel tempo.
    Vorrei estrapolare una tabella tipo :
    utente : giovanni
    nome_azione - valore_offerta
    fiat 10
    lancia 8

    cioè per ogni utente tutti nomi_azione che hanno il valore_offerta più alto visualizzando anche agli altri campi del database

    Grazie a chi prima di me ha trovato la soluzione.

  2. #2

    Precisazione per select max valore

    Precisazione :

    nome_azione | nome_offerta | valore_offerta | altro_campo
    fiat | giovanni | 10 | yfuyf
    ferrari | francesco | 5 | guogerh
    lancia | giovanni | 8 | ugiugug
    ferrari | giovanni | 3 | tdutdfu
    fiat | ernesto | 5 | yfyfyf
    fiat | giovanni | 5 | yfguyfyu

    come si vede per una stessa azione posso fare più offerte nel tempo.
    Vorrei estrapolare una tabella tipo :
    utente : giovanni
    nome_azione | valore_offerta
    fiat | 10 (valore max riferirito alle offerta su fiat)
    lancia | 8 (valore mx riferito alle offerte su lancia)

    cioè per ogni utente tutti nomi_azione che hanno il valore_offerta più alto visualizzando anche agli altri campi del database
    Ho provato in vari modi ma non sono riuscito a realizzare quello che voglio.
    Magari è una sciocchezza.
    Grazie

  3. #3

    Precisazioni ed esempi

    Le sto provando tutte.
    La tabella è questa :
    nome_azione | nome_offerta | valore_offerta | altro_campo
    fiat | giovanni | 10 | yfuyf
    ferrari | francesco | 5 | guogerh
    lancia | giovanni | 8 | ugiugug
    ferrari | giovanni | 3 | tdutdfu
    fiat | ernesto | 5 | yfyfyf
    fiat | giovanni | 5 | yfguyfyu

    Questa :
    sql = "SELECT nome_azione, altro_campo , max (valore_offerta ) FROM tabella WHERE nome_offerta = '" & nomeofferta & "' GROUP BY nome_azione, altro_campo "

    mi dà il seguente risultato quasi giusto (non visualizza il valore_offerta)
    nome_azione | altro_campo | valore_offerta
    fiat | yfuyf | (vuoto)
    lancia | ugiugug | (vuoto)
    Se con la stessa sql cerco di ricavare rs.(valore_offerta) mi blocca con
    Item cannot be found in the collection corresponding to the requested name or ordinal.

    /cgi-bin/hhh.asp, line 142
    dove la linea 142 è : valore = rs("valore_offerta") .

    Con questa sql
    sql = "SELECT nome_azione, altro_campo , max (valore_offerta ) FROM tabella WHERE nome_offerta = '" & nomeofferta & "' GROUP BY nome_azione, altro_campo,valore_offerta "

    mi dà tutto l'elenco delle offerte cha ha fatto "giovanni", non solo i max. E non ho la riga 142. Se la inserisco mi dà sempre l'errore precedente.

    Con questa sql
    sql = "SELECT nome_azione, altro_campo , valore_offerta ,max (valore_offerta ) FROM tabella WHERE nome_offerta = '" & nomeofferta & "' GROUP BY nome_azione, altro_campo,valore_offerta "

    mi visualizza sempre tutto l'elenco, stavolta anche con valore_offerta ma non applica la MAX.

    Ho provato anche con clausole HAVING ma non so bene come intrecciare il tutto.
    Grazie della pazienza.

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Con 2 query si puo fare facilmente
    Con 1 sola query non è possibile
    ___ ( Oppure al di sopra delle mie capacita attuali ) ___
    _________________________________________________
    Query1
    codice:
    SELECT Tabella.nome_offerta, Tabella.nome_azione, Max(Tabella.valore_offerta) AS MaxDivalore_offerta
    FROM Tabella
    GROUP BY Tabella.nome_offerta, Tabella.nome_azione;
    Query2
    codice:
    SELECT Tabella.nome_azione, Tabella.nome_offerta, Tabella.valore_offerta, Tabella.altro_campo
    FROM Query1 INNER JOIN Tabella ON (Query1.MaxDivalore_offerta = Tabella.valore_offerta) AND (Query1.nome_offerta = Tabella.nome_offerta) AND (Query1.nome_azione = Tabella.nome_azione);
    __________________________________________________ __
    Se riesci a farlo con 1 sola query facci sapere.
    _________________________________________________
    NB. Tieni presente che naturalmente non puoi avere 2 record
    con offerta=offerta azione=azione
    VALORE=VALORE SE QUESTO CORRISPONDE AL MASSIMO


    Saluti



    __________________________________________________ ___

  5. #5

    Database con record valore massimo

    Grazie per la risposta. So già che con una sola query la cosa è improbabile o addirittura impossibile, cercavo qualcosa che in effetti le riunisse insieme.
    Ho provato come mi hai detto :

    sql1 = SELECT Tabella.nome_offerta, Tabella.nome_azione, Max(Tabella.valore_offerta) AS MaxDivalore_offerta
    FROM Tabella
    GROUP BY Tabella.nome_offerta, Tabella.nome_azione;

    sql = SELECT Tabella.nome_azione, Tabella.nome_offerta, Tabella.valore_offerta, Tabella.altro_campo
    FROM Query1 INNER JOIN Tabella ON (Query1.MaxDivalore_offerta = Tabella.valore_offerta) AND (Query1.nome_offerta = Tabella.nome_offerta) AND (Query1.nome_azione = Tabella.nome_azione);

    ho sostituito a query1 la stringa ma mi dà il seguente errore :
    Microsoft OLE DB Provider for ODBC Drivers error '80040e37'

    [Microsoft][ODBC Microsoft Access Driver] The Microsoft Jet database engine cannot find the input table or query 'sql1'. Make sure it exists and that its name is spelled correctly

    e la linea è : rs.Open sql, Connessione, 3, 3

    Come faccio a intrecciare la oppure le apertura al recordset?
    Non sono proprio capace.
    Ciao e grazie

  6. #6
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    ho sostituito a query1 la stringa ma mi dà il seguente errore :
    Non dovevi sostituire niente andava gia bene.
    __________________________________________________ _____________

    La prima query chiamala esattamente " Query1 "
    mentre il codice è quello di prima ( ma lo ripeto )
    codice:
    SELECT Tabella.nome_offerta, Tabella.nome_azione, Max(Tabella.valore_offerta) AS MaxDivalore_offerta
    FROM Tabella
    GROUP BY Tabella.nome_offerta, Tabella.nome_azione;
    __________________________________________________ _______________

    La seconda query chiamala " come vuoi te "
    mentre il codice è quello di prima ( ma lo ripeto )
    codice:
    SELECT Tabella.nome_azione, Tabella.nome_offerta, Tabella.valore_offerta, Tabella.altro_campo
    FROM Query1 INNER JOIN Tabella ON (Query1.MaxDivalore_offerta = Tabella.valore_offerta) AND (Query1.nome_offerta = Tabella.nome_offerta) AND (Query1.nome_azione = Tabella.nome_azione);
    __________________________________________________ ___________________

    Cosi gia funziona.
    Se non ti dovesse piacere il nome Query1 per la prima query la puoi rinominare

    SOLO IN QUESTO CASO nella seconda query devi andare a sostituire dovunque
    leggi Query1 ___ NON UNA STRINGA ___ bensi il nome che hai dato alla prima query

    __In altre parole nella seconda query ci sono dei riferimenti al nome della prima query.
    Se cambi il nome della prima devi cambiare i riferimenti nella seconda

    __________________________________________________ _____________

    Fammi sapere

  7. #7

    Database con record valore massimo

    Scusa ma forse mi sfugge qualcosa.
    Lavoro in ASP su database Access.
    Di solito mi connetto al database in questo modo :
    Set Connessione = Server.CreateObject("adodb.connection")
    Connessione.Open = "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("/mdb-database/miodbs.mdb")

    Set Esempio = Server.CreateObject("adodb.recordset")

    sql = "SELECT * From MiaTabella"

    Esempio.Open sql, Connessione, 3, 3

    Esempio_id = esempio("ID")

    ecc. con tutti i campi che mi interessano.

    Ora come dici tu dovrei fare
    Query1 = "SELECT Tabella.nome_offerta, Tabella.nome_azione, Max(Tabella.valore_offerta) AS MaxDivalore_offerta FROM Tabella GROUP BY Tabella.nome_offerta, Tabella.nome_azione"

    sql = "SELECT Tabella.nome_azione, Tabella.nome_offerta, Tabella.valore_offerta, Tabella.altro_campo FROM Query1 INNER JOIN Tabella ON (Query1.MaxDivalore_offerta = Tabella.valore_offerta) AND (Query1.nome_offerta = Tabella.nome_offerta) AND (Query1.nome_azione = Tabella.nome_azione)"

    e poi lanciare l'apertura al record con
    Esempio.Open sql, Connessione, 3, 3

    Però mi dà :
    Microsoft OLE DB Provider for ODBC Drivers error '80040e37'

    [Microsoft][ODBC Microsoft Access Driver] The Microsoft Jet database engine cannot find the input table or query 'query1'. Make sure it exists and that its name is spelled correctly.

    sulla riga proprio di "Esempio.Open sql, Connessione, 3, 3"
    Come dovrei fare nello specifico?
    Grazie

  8. #8
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Caspita non havavo capito che lavoravi con ASP

    Pensavo fosse solamente Access.

    ______________________________________________

    Non ho mai lavorato con ASP su Access percio non ho esperienza diretta.

    Tuttavia so che le 2 query con ASP non sono una buona idea.

    _______________________________________________

    Ti consiglio se puoi di spostare le 2 query in access e li arrivi
    al tuo risultato gia finito

    Poi con ASP punti alla 2° query come se fosse una tabella
    ( Spero sia possibile )

    In pratica sposti nel DB una parte dell'applicativo ASP

  9. #9
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244

    Re: Database con record valore massimo

    Originariamente inviato da daniele512
    Vorrei estrapolare una tabella tipo :
    utente : giovanni
    nome_azione - valore_offerta
    fiat 10
    lancia 8

    cioè per ogni utente tutti nomi_azione che hanno il valore_offerta più alto visualizzando anche agli altri campi del database

    Questa mi da i 3 record di giovanni con l'offerta più alta per ogni nome_azione:
    codice:
    SELECT nome_offerta, nome_azione, Max(valore_offerta) AS Valore 
    FROM test 
    WHERE nome_offerta= 'giovanni' 
    GROUP BY nome_azione, nome_offerta
    che sono:
    ferrari 3
    fiat 10
    lancia 8



  10. #10

    Database con record valore massimo

    Grazie Gibra
    in effetti con il tuo esempio ho parzialmente risolto

    SELECT nome_offerta, nome_azione, Max(valore_offerta) AS Valore
    FROM test
    WHERE nome_offerta= 'giovanni'
    GROUP BY nome_azione, nome_offerta

    in quanto mi dà correttamente l'elenco delle azioni con l'offerta più alta fatta da giovanni.
    Se però cerco di visualizzare altri campi :
    1) se non li inserisco nella GROUP BY non li visualizza e mi dice appunto che non sono inseriti della funzione di aggregazione.
    2) se li inserisco anche nella GROUP BY li visualizza tutti, senza attuare la clausola MAX.

    Come si può ovviare?
    Grazie in ogni caso
    Ciao
    Daniele512

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.