Query che visualizza record con valore minimo

di il
19 risposte

Query che visualizza record con valore minimo

Buongiorno,

ho creato un database per la gestione dei listini delle autovetture, il problema su cui mi sto riscontrando al momento è il seguente:
ho una tabella con tutti i dati delle autovetture:

Marca, modello, carrozzeria, alimentazione, trasmissione, cv, cilindrata, promo

io vorrei che la query mi restituisse il record in base all'alimentazione disponibile (benzina, diesel, gpl, ecc..) con il prezzo più basso, in modo da avere:

Alfa romeo, mito, 3p, benzina, manuale, 78cv, 1400, 9.900
Alfa romeo, mito, 3p, diesel, manuale, 90cv, 1300, 10.900
Alfa romeo, mito, 3p, GPL, manuale, 120cv, 1400, 10.900

al momento ho provato utilizzando questa query

SELECT Marca, Modello, Carrozzeria, Alimentazione, Trasmissione, cv, Cilindrata, Min(Promo) AS Promo
FROM [Listini Completi]
GROUP BY Marca, Modello, Carrozzeria, Alimentazione, Trasmissione, cv, Cilindrata

e mi indica l'elenco tutte le auto differenziando l'alimentazione, la trasmissione, i cv, e la cilindrata

ho provato ad usare anche la funzione Primo, ecc... però mi mischia i dati mettendomi il prezzo più basso con il primo valore anche se questi sono su 2 record diversi

Qualcuno riuscirebbe a dirmi come poter fare per avere il risultato che cercavo, quindi visualizzare solo il record che contiene il prezzo più basso in base a marca, modello ed alimentazione

Grazie in anticipo

19 Risposte

  • Re: Query che visualizza record con valore minimo

    Se vuoi ottenere i dati (per Marca, Modello ed Alimentazione) devi raggrupparli ed ordinarli, in modo da ottenere il valore minimo di ciascuno:
    
    SELECT Listino.Marca, Listino.Modello, Listino.Alimentazione, Min(Listino.PrezzoPromo) AS MinDiPrezzoPromo
    FROM Listino
    GROUP BY Listino.Marca, Listino.Modello, Listino.Alimentazione
    ORDER BY Listino.Marca, Listino.Modello, Listino.Alimentazione;
    
  • Re: Query che visualizza record con valore minimo

    Così mi funziona il problema che vorrei visualizzare anche gli altri dati trasmissione, cv, cilindrata.

    Ed in quel caso o mi fa vedere più record perché ci sono più cavalli, cilindrate ecc..
    Oppure mi mischia i record se per esempio uso la funzione primo

    Riesci a darmi informazioni su come risolvere il problema

    Grazie
  • Re: Query che visualizza record con valore minimo

    Chiaramente la soluzione del raggruppamento funziona ma proprio per come ragiona questo metodo si applica fino al punto in cui puoi raggruppare, sapendo che i dati non raggruppabili si perdono.

    Quindi se hai un esigenza differente devi usare un metodo differente.... un Po più complesso.
    Qui trovi un esempio che devi personalizzare:
  • Re: Query che visualizza record con valore minimo

    Ciao Alex
    Sto provando ad usare il tuo esempio riusciresti a dirmi come compilare l’SQL con i miei dati

    Grazie
  • Re: Query che visualizza record con valore minimo

    Per avere maggiori informazioni sulle tabelle derivate (anche riscontrabile nei termini di query nidificate o sub-query) puoi leggere la documentazione sotto-riportata:

    https://msdn.microsoft.com/en-us/library/office/ff192664.aspx
    https://support.office.com/it-it/article/nidificare-una-query-all-interno-di-un-altra-query-o-in-un-espressione-utilizzando-una-sottoquery-a8532322-e42f-4f94-bc38-ace7c182916a
    http://www.hoepliscuola.it/download/4595/uda3-l5.asp
    http://allenbrowne.com/subquery-01.htm
    http://access-excel.tips/access-sql-select-max-record
  • Re: Query che visualizza record con valore minimo

    Ciao Willy55,
    ho letto le guide che mi hai girato, ma in tutte si parla sempre di relazioni tra 2 query, io invece ho tutto in un'unica query
  • Re: Query che visualizza record con valore minimo

    segretoautomobili ha scritto:


    Ciao Willy55,
    ho letto le guide che mi hai girato, ma in tutte si parla sempre di relazioni tra 2 query, io invece ho tutto in un'unica query
    Non ci credo che non riesci a modificare la tua realtà facendo una sostituzione dei campi di questo esempio:
    
    Select T1.Provenienza,MINP.IdProdotto,MINP.Minimo
        From T1
        RIGHT JOIN
            (select IdProdotto, Min(Prezzo) as Minimo
             From T1
             Group By IdProdotto) AS MINP
        ON T1.IdProdotto=MINP.IdProdotto AND T1.Prezzo=MINP.Minimo
    Come riferimento hai 2 Campi solo non sarà quello il problema...?

    Poi una volta che hai compreso come funziona al minimo aggiungiu i campi che ti servono.
  • Re: Query che visualizza record con valore minimo

    Ciao Alex,
    quello che mi succede cercando di usare la query è questo:
    mi visualizzare i record con il prezzo minimo, e me li raggruppa per tutti i vari dati, io quello che vorrei fare è avere il prezzo minimo e far risultare solo il primo record (mettendolo in ordine di prezzo) per alimentazione, però se provo a usare i criteri Min o Primo per ad'esempio il campo cv o trasmissione, mi crea un record mischiato
  • Re: Query che visualizza record con valore minimo

    segretoautomobili ha scritto:


    Ciao Alex,
    quello che mi succede cercando di usare la query è questo:
    mi visualizzare i record con il prezzo minimo, e me li raggruppa per tutti i vari dati, io quello che vorrei fare è avere il prezzo minimo e far risultare solo il primo record (mettendolo in ordine di prezzo) per alimentazione, però se provo a usare i criteri Min o Primo per ad'esempio il campo cv o trasmissione, mi crea un record mischiato
    Quella del "Primo" è una cosa che esce ora, sei stato poco preciso nel primo esposto e continui ad esserlo.
    Quindi quando dici Primo Record in base a quale Criterio o Campo...? i Dati in tabella non hanno un criterio di ordinamento come i fogli di Excel, possono essere ordinabili per qualsiasi dei Campi presenti.

    Se intendi IKPk allora usa la Clausola TOP 1, ed un OrderBy sul campo criterio di Ordinamento.
  • Re: Query che visualizza record con valore minimo

    Utilizzando il codice che mi hai allegato mi visualizza solo il numero di righe, a me serve un codice che mi permetta di dire alla query di visualizzare il campo abbinato alla stessa riga del campo visualizzato, quindi se mi trovo ad avere più record così disposti su una tabella

    ID, Marca, Modello, Prezzo, Alimentazione, Trasmissione
    1, Alfa Romeo, Mito, 11.990, Benzina, Manuale
    2, Alfa Romeo, Mito, 10.990, Benzina, Automatica
    3, Alfa Romeo, Mito, 9.990, Benzina, Manuale
    4, Alfa Romeo, Giulietta, 10.990, Benzina, Manuale
    2, Alfa Romeo, Mito, 9.990, Benzina, Automatica
    3, Alfa Romeo, Mito, 11.990, Benzina, Manuale

    e vorrei avere poter visualizzare i record con il prezzo minimo raggruppati per marca e modello avendo il seguente risultato:
    3, Alfa Romeo, Mito, 9.990, Benzina, Manuale
    2, Alfa Romeo, Giulietta, 9.990, Benzina, Automatica

    Se qualcuno riesce a darmi qualche ulteriore spunto

    grazie
  • Re: Query che visualizza record con valore minimo

    Puoi creare due query, come puoi vedere dall'immagine allegata, prima la qPrezzoMinimoPerMarca_Modello poi la qListinoPrezzoMinimoPerMarca_Modello e lanciando quest'ultima ottieni il risultato.
    Allegati:
    21646_780020b1a283a1b071ee6aad9bb72778.png
    21646_780020b1a283a1b071ee6aad9bb72778.png
  • Re: Query che visualizza record con valore minimo

    Segretoautomobili,
    non è che ti sei sforzato nell'impegnarti ad implementare quanto suggerito, anzi presenti delle ulteriori incongruenze.

    In merito al tuo ultimo esempio fornito, indichi nella tabella di partenza che il Modello="Giulietta" (ID=4) ha la Trasmissione="Manuale" e non si comprende perché dovrebbe presentare il dato "Automatica" (che magari si riferisce ad altro modello, ad esempio il record con ID=2).
    Inoltre per il Modello="Mito" con ID=2 vi sono prezzi diversi (10990 e 9990) ed alimentazioni diverse, mentre per quella con ID=3 prezzi diversi (11990 e 9990) e stessa Alimentazione ("Manuale") ne consegue che stabilito il prezzo minimo a 9990 perché il risultato dovrebbe quello con Alimentazione="Manuale" ?
    Infine la tabella appare con ID ripetuti (e dati correlati che possono avere diversità differenti) per cui sarebbe da analizzare, ulteriormente, la struttura originaria e le eventuali operazioni su essa effettuate in modo da individuare se si sia partiti da una situazione normalizzata ed implementata correttamente.

    Per quanto riguarda le indicazioni fornite, non credo che tu abbia compreso ed esaminato correttamente i suggerimenti

    Segretoautomobili ha scritto:


    Ciao Willy55,
    ho letto le guide che mi hai girato, ma in tutte si parla sempre di relazioni tra 2 query, io invece ho tutto in un'unica query
    Se avessi seguito quanto indicato sulle Tabelle derivate ti saresti accorto che è possibile realizzare tutto con una singola query, quindi riprendendo il codice presentato da Alex avresti, ad esempio:
    
    SELECT Auto.Marca, Auto.Modello, Auto.Carrozzeria, Auto.Alimentazione, 
           Auto.Trasmissione, Auto.CV, Auto.Cilindrata, 
           MINP.Marca, MINP.Modello, MINP.Alimentazione, MINP.Minimo
    FROM Auto RIGHT JOIN 
      [select Marca, Modello, Alimentazione, Min(PrezzoPromo) as Minimo   
           From Auto          
           Group By Marca, Modello, Alimentazione]. AS MINP 
    ON (Auto.PrezzoPromo=MINP.Minimo) AND 
       (Auto.Alimentazione=MINP.Alimentazione) AND 
       (Auto.Modello=MINP.Modello) AND (Auto.Marca=MINP.Marca);
    
    Se parliamo di due query separate, come nell'ultima soluzione che ti è stata fornita, la prima rappresenta la query interna (sub-query) con i dati del raggruppamento e del minimo di ciascuno la quale va messa in relazione con una esterna che contenga tutte le informazioni aggiuntive non presenti nel raggruppamento.
    Impiegando il linguaggio SQL uno sarebbe potuto partire dalla query originaria descritta sopra (ad esempio denominata subQueryInterna):
    
    SELECT Auto.Marca, Auto.Modello, Auto.Alimentazione, Min(Auto.PrezzoPromo) AS MinDiPrezzoPromo
    FROM Auto
    GROUP BY Auto.Marca, Auto.Modello, Auto.Alimentazione;
    
    e si implementerà la query esterna in relazione con la precedente (in INNER JOIN o LEFT JOIN) come nel seguente esempio:
    
    SELECT Auto.Marca, Auto.Modello, Auto.Carrozzeria, Auto.Alimentazione, 
           Auto.Trasmissione, Auto.CV, Auto.Cilindrata, Auto.PrezzoPromo, 
           subQueryInterna.MinDiPrezzoPromo
    FROM subQueryInterna 
           INNER JOIN Auto ON 
              (subQueryInterna.Marca=Auto.Marca) AND 
              (subQueryInterna.Modello=Auto.Modello) AND 
              (subQueryInterna.Alimentazione=Auto.Alimentazione) AND 
              (subQueryInterna.MinDiPrezzoPromo=Auto.PrezzoPromo);
    
    Ma tant'è.
  • Re: Query che visualizza record con valore minimo

    Ciao Willy,
    ho purtroppo sbagliato a scrivere l'esempio (ero a mezzo addormentato)

    ID, Marca, Modello, Prezzo, Alimentazione, Trasmissione
    1, Alfa Romeo, Mito, 11.990, Benzina, Manuale
    2, Alfa Romeo, Mito, 10.990, Benzina, Automatica
    3, Alfa Romeo, Mito, 9.990, Benzina, Manuale
    4, Alfa Romeo, Giulietta, 10.990, Benzina, Manuale
    5, Alfa Romeo, Giulietta, 9.990, Benzina, Automatica
    6, Alfa Romeo, Giulietta, 11.990, Benzina, Manuale

    e vorrei avere poter visualizzare i record con il prezzo minimo raggruppati per marca e modello avendo il seguente risultato:
    3, Alfa Romeo, Mito, 9.990, Benzina, Manuale
    5, Alfa Romeo, Giulietta, 9.990, Benzina, Automatica

    quindi mi interessa che il risultato visibile sia quello di tutto il record, solo che invece a volte mi mischia i risultati
  • Re: Query che visualizza record con valore minimo

    segretoautomobili ha scritto:


    quindi mi interessa che il risultato visibile sia quello di tutto il record, solo che invece a volte mi mischia i risultati
    Stai girando sempre attorno al problema; da notare che da tutti gli utenti ti sono state date, precise ed esaustive indicazioni per la soluzione del tuo caso.
    Per concludere, hai adattato gli esempi alla tua struttura ?
    Perché non ha senso la tua conclusione, quando dici: "mischia i risultati"; in quanto o gli esempi non sono stati implementati o questi, da te, non correttamente impiegati.
Devi accedere o registrarti per scrivere nel forum
19 risposte