Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Freedom
    Registrato dal
    Jan 2003
    Messaggi
    839

    Distinct, group by,... oppure?

    Ciao a tutti quanti!!!

    Vengo direttamente al punto.

    Ho la necessità di prelevare da questa tabella solo un prodotto per CodProdotto.

    StrSQL = "SELECT DISTINCT IdPro, CodProdotto, Nome, IdMa, Prezzo, Perc, Foto FROM prodotti WHERE ID = "&Id



    Esempio:

    idPro | CodProdotto | Nome | IdMa | ..
    1 | A22 | pippo | os | ...
    2 | A22 | pluto | os | .l.
    3 | B33 | paperino | os | ...


    deve essere estratto:
    1, A22, pippo, os, ....
    3, B33, paperino, os, ....


    Come si fa?

    Grazie anticipate
    Sicut Nox Silentes

  2. #2
    Mmmmmh.... .se vuoi tirare fuori tutti quegli attributi è un casino.

    La Group By potrebbe servire.... ma sta di fatto che tu hai due record differenti con lo stesso Id Prodotto.

    Mi sa che risolvi solo con una Query nidificata.

    strSQL = "SELECT * FROM Prodotti WHERE ID IN (SELECT DISTINCT IdPro FROM Prodotti WHERE ID = " & Id & ")"

    Credo che così possa funzionare.... ovviamente al posto dell'asterisco puoi mettere solo i campi che ti interessano.

    Funge? (scusa ma sono un pò scarso su SQL )

  3. #3
    Utente di HTML.it L'avatar di Freedom
    Registrato dal
    Jan 2003
    Messaggi
    839
    Originariamente inviato da pictor
    Mmmmmh.... .se vuoi tirare fuori tutti quegli attributi è un casino.

    La Group By potrebbe servire.... ma sta di fatto che tu hai due record differenti con lo stesso Id Prodotto.
    :master: No, IdPro non può mai essere uguale ad un altro IdPro, essendo di tipo 'contatore'. Semmai è il CodProdotto che può essere uguale. Ma, ovviamente, la chiave primaria è IdPro.
    Sicut Nox Silentes

  4. #4
    Ops perdonami ho guardato male lo schema che avevi fornito

    Naturalmente intendevo CodProdotto.... credo che funzioni così, no?

  5. #5
    Utente di HTML.it L'avatar di Freedom
    Registrato dal
    Jan 2003
    Messaggi
    839
    Ciao e grazie per l'interessamento, pictor!

    Mi sa di aver fatto un pò di confusione.

    Vi riporto la tabella reale:

    IdPro (contatore,chiave primaria) | CodPro | Nome | IdMa | IdSottoCat | Foto

    Dunque, dalla variabile 'IdSottoCat', che ricevo da form, devo estrarre tutti i records. E quelli con 'CodPro' duplicato, li devo scrivere una sola volta.

    Ovviamente, devo prelevare tutti quei campi sopra riportati.

    Spero di essermi spiegato meglio..
    Sicut Nox Silentes

  6. #6
    A dir la verità ho capito ancora meno

    Allora, tu vuoi elencare i prodotti che appartengono ad una certa sottocategoria?

    Se sì allora fai
    codice:
    strSQL = "SELECT * FROM Prodotti WHERE IdSottoCat IN (SELECT DISTINCT IdSottoCat FROM Prodotti WHERE IdSottoCat = " & IdCategoria & ")"
    Se invece volevi (come dicevi all'inizio) prendere un prodotto per ogni Codice prodotto (su N prodotti di risultato ne viene preso solo uno a caso) il cui codice prodotto è quello passato fai

    codice:
    strSQL = "SELECT * FROM Prodotti WHERE IdPro IN (SELECT TOP 1 IdPro FROM Prodotti WHERE CodPro = " & CodProdotto & ")"
    (La select interna ti prende una sola volta ogni prodotto corrispondente al codice prodotto fornito. La select esterna ti permette, su questi risultati, di prenderne tutti gli attributi)

    Il problema è che purtroppo non capisco bene come hai strutturato le tabelle.
    La tabella che mi dai è quella dei prodotti? Perchè non mi torna che due prodotti diversi abbiano lo stesso codice.
    Non dovrebbe essere possibile.... evidentemente mi sfugge qualcosa che non hai specificato.

  7. #7
    Utente di HTML.it L'avatar di Freedom
    Registrato dal
    Jan 2003
    Messaggi
    839
    Dunque,

    codice:
    strSQL = "SELECT * FROM Prodotti WHERE IdSottoCat IN (SELECT DISTINCT IdSottoCat FROM Prodotti WHERE IdSottoCat = " & IdCategoria & ")"
    Questa è quella che ci si avvicina di più. ma non funziona, nel senso che mi prende tutti i prodotti: tutti quanti!

    La tabella che mi dai è quella dei prodotti? Perchè non mi torna che due prodotti diversi abbiano lo stesso codice.
    Non dovrebbe essere possibile.... evidentemente mi sfugge qualcosa che non hai specificato.
    Due prodotti diversi hanno due CodProdotto diversi.
    Due prodotti simili, ma con caratteristiche diverse, hanno lo stesso CodProdotto.
    Esempio:
    --ProdottoA--
    IdProdotto=1 (contatore)
    CodProdotto=A2
    DettagliVarianti=ABC
    SottoCat=3


    --ProdottoB--
    IdProdotto=2 (contatore)
    CodProdotto=A2
    DettagliVarianti=DEF (questa sarebbe l'unica cosa che cambia tra i 'diversi' prodotti aventi uguale CodProdotto)
    SottoCat=3


    Comunque, se hai qualche altro modo per organizzare il database: accetto consigli!
    Sicut Nox Silentes

  8. #8
    aspetta che la butto giu pesante

    codice:
    SELECT * FROM Prodotti WHERE IdSottoCat IN 
    (SELECT DISTINCT IdSottoCat FROM Prodotti WHERE IdSottoCat = " & IdCategoria & ")
    
    AND
    
    not exists (select t2.codpro from Prodotti t2 where t2.idprodotto<>Prodotti.idprodotto and t2.idSottoCat=Prodotti.idSottoCat and t2.codpro=Prodotti.codpro)
    mi sembra che possa anche andare...probabilmente con i join (left) sarebbe stata migliore...boh prova

    quello che ho aggiunto io dice: E non esiste(selezionami il codprodotto da Prodotti dove l'id del record deve essere diverso dal record corrente e la sottocategoria deve essere uguale e il codpro deve essere uguale) (in pratica la situazione che hai descritto sotto...ID diverso, stessa sottocategoria, stesso codpro)

  9. #9
    Originariamente inviato da Freedom
    ....................
    Mi sa di aver fatto un pò di confusione.

    Vi riporto la tabella reale:

    IdPro (contatore,chiave primaria) | CodPro | Nome | IdMa | IdSottoCat | Foto

    Dunque, dalla variabile 'IdSottoCat', che ricevo da form, devo estrarre tutti i records. E quelli con 'CodPro' duplicato, li devo scrivere una sola volta.

    Ovviamente, devo prelevare tutti quei campi sopra riportati.

    Spero di essermi spiegato meglio..
    Ciao, ...se ho ben capito puoi fare così :

    codice:
    -- hai un solo record (quello con idprod minore) per ogni 
    --coppia distinta (idsottocat,codprod)
    select p.* from prodotti as p
    inner join
    (
     select min(idprod) as minidprod from
     prodotti group by  idsottocat,codprod
    ) as q
    on p.idprod=q.minidprod
    
    -- se invece vuoi considerare solo una prefissata sottocategoria x:
    
    select p.* from prodotti as p
    inner join
    (
     select min(idprod) as minidprod from
     prodotti group by  codprod
     where idsottocat=x
    ) as q
    on p.idprod=q.minidprod
    Ciao sspintux

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 © 2025 vBulletin Solutions, Inc. All rights reserved.