Una query che non riesco a risolvere

mercoledì 19 settembre 2012 - 10.55
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  SQL Server 2008 R2

zseven Profilo | Senior Member

Ciao ragazzi,
ho 3 tabelle che utilizzo per visualizzare dei prodotti:
tab_prodotti_base
tab_prodotti_det
tab_prodotti_prezzi

Vi scrivo sotto a tutte le tre CREATE.

In pratica nella tabella "base" ci sono le informazioni comuni a tutti i prodotti.
Nella tabella "det" c'è la chiave secondaria ID_prodotti_base, la chiave secondaria della culture ed il nome del prodotto che varia (se è italiano o inglese)
Nella tabella "prezzi" ci sono prezzo, sconto e quantità per ogni singola tipologia di prodotto, infatti se vedete vengono richiamati altri due id per "dettaglio_uno" e "dettaglio_due".
A seconda quindi delle caratteristiche del prodotto che vengono definite con i valori di dettaglio_uno e dettaglio_due avrò un prezzo, uno sconto ed una quantità differente.

Adesso io ho la necessità di far visualizzare in una pagina il prodotto base con il prezzo al netto dello sconto più basso, e solo dopo se si entra nel dettaglio del prodotto mostrare gli altri prezzi a seconda del differente dettaglio.

Facendo una query di questo tipo ottengo che vengono visualizzate tutte le possibili combinazioni di dettaglio_uno e due e non è quello che cerco:

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

Spero di essermi spiegato bene e che riusciate a darmi una mano.
Grazie mille!

CREATE TABLE [dbo].[tab_prodotti_base]( [ID_prodotti_base] [int] IDENTITY(1,1) NOT NULL, [id_tree] [int] NOT NULL, [id_genere] [int] NOT NULL, [id_tipo] [int] NULL, [codice_prodotto_base] [nvarchar](max) NULL, [calibro_prodotto_base] [nvarchar](max) NULL, [ponte_prodotto_base] [nvarchar](max) NULL, [asta_prodotto_base] [nvarchar](max) NULL, [foto_prodotto_base] [nvarchar](max) NULL, [peso_prodotto_base] [numeric](18, 0) NULL, [offerta_prodotto_base] [bit] NULL, [primopiano_prodotto_base] [bit] NULL, [visualizza_prodotto_base] [bit] NULL, [elimina_prodotto_base] [bit] NULL, [newsletter_prodotto_base] [bit] NULL ) ON [PRIMARY]

CREATE TABLE [dbo].[tab_prodotti_det]( [ID_prodotti_det] [int] IDENTITY(1,1) NOT NULL, [id_culture] [int] NOT NULL, [id_prodotto_base] [int] NOT NULL, [nome_prodotto_det] [nvarchar](max) NULL, [testo_prodotto_det] [nvarchar](max) NULL, [materiale_prodotto_det] [nvarchar](max) NULL, [visualizza_prodotto_det] [bit] NULL, [elimina_prodotto_det] [bit] NULL ) ON [PRIMARY]

CREATE TABLE [dbo].[tab_prodotti_prezzi]( [ID_prodotti_prezzi] [int] IDENTITY(1,1) NOT NULL, [id_prodotto_base] [int] NOT NULL, [id_dettaglio_uno] [int] NOT NULL, [id_dettaglio_due] [int] NOT NULL, [prezzo_prezzo] [decimal](18, 2) NULL, [sconto_prezzo] [int] NULL, [quantita_prezzo] [int] NULL ) ON [PRIMARY]

boccia75 Profilo | Junior Member

Ciao,
una cosa molto utile che potresti fare è quella di dare alcune righe delle tabelle e, in base a quelle, il risultato che vorresti ottenere.
Altrimenti, ma parlo per me, ho difficoltà a capire cosa vuoi ottenere.
Ciao!

alx_81 Profilo | Guru

>Ciao ragazzi,
Ciao

>Spero di essermi spiegato bene e che riusciate a darmi una mano.
io agirei di order by DESC sullo sconto, in modo che dove lo sconto è più alto, hai il prezzo migliore.
Poi se ne vuoi ottenere solo uno, con quella order by, vai di TOP 1 nella select.
Che ne pensi?

>Grazie mille!
di nulla!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Ciao ragazzi grazie per le risposte,
proprio pochi minuti fa ho trovato un altro sistema, e cioè ho aggiunto un campo boolean nella tabella_det che spunto a true solo per quello che viene inserito inizialmente. In questa maniera nella query ho aggiunto una condizione in più ed ho risolto, diciamo, aggirando il problema.

Grazie mille!

alx_81 Profilo | Guru

>Ciao ragazzi grazie per le risposte,
>proprio pochi minuti fa ho trovato un altro sistema, e cioè ho
>aggiunto un campo boolean nella tabella_det che spunto a true
>solo per quello che viene inserito inizialmente. In questa maniera
>nella query ho aggiunto una condizione in più ed ho risolto,
>diciamo, aggirando il problema.
Ok, però sei sicuro che il primo sia quello corretto?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Sì è vero, è probabile che il primo che viene inserito non è quello con il prezzo più basso.
Ho pensato che comunque posso farlo gestire da pannello in modo da far impostare al cliente la preferenza di visualizzazione.

alx_81 Profilo | Guru

>Sì è vero, è probabile che il primo che viene inserito non è
>quello con il prezzo più basso.
>Ho pensato che comunque posso farlo gestire da pannello in modo
>da far impostare al cliente la preferenza di visualizzazione.
Quello sempre, ma perchè l'order by non andrebbe bene?
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

sì sull'order by va bene, ho il problema legato al top 1, perchè non devo ottere solo un risultato in totale, ma un risultato per ogni singolo prodotto, quindi per esempio in homepage devo mostrare 12 articoli e per ogni articolo mostrare quello con il prezzo più basso.
Con la query che avevo fatto io invece lui mi mostrava tutte le soluzioni possibile per ogni singolo articolo.

Non so se mi sono spiegato bene :D

alx_81 Profilo | Guru

>sì sull'order by va bene, ho il problema legato al top 1, perchè
>non devo ottere solo un risultato in totale, ma un risultato
>per ogni singolo prodotto, quindi per esempio in homepage devo
>mostrare 12 articoli e per ogni articolo mostrare quello con
>il prezzo più basso.
>Con la query che avevo fatto io invece lui mi mostrava tutte
>le soluzioni possibile per ogni singolo articolo.
ok ma la top 1 puoi farla nell'app.. il db te le torna solo ordinate

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

mmm... qui ti ho perso...

alx_81 Profilo | Guru

>mmm... qui ti ho perso...
Quella query dove deve essere passata? Comunque ci sarà un'applicazione che la legge no?
Ecco.. l'app legge solo la prima, ma tiene in pancia il resto.
Il db si occupa solo di ordinare.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

beh sì la query viene letta da un ListView che deve mostrare, ad esempio come ti ho detto prima, 12 articoli.
Continuo a non capire a cosa ti riferisci.
A cosa mi serve un TOP 1 se devo mostrare 12 articoli?

Io dalla query devo ottenere in risposta l'elenco completo di articoli, che ad esempio stanno in offerta, e per ognuno di questi mostrare solo la combinazione più economica su "n" combinazioni possibili.

alx_81 Profilo | Guru

>Io dalla query devo ottenere in risposta l'elenco completo di
>articoli, che ad esempio stanno in offerta, e per ognuno di questi
>mostrare solo la combinazione più economica su "n" combinazioni
>possibili.
ok allora potresti fare una query creando al volo il campo che che aggiungeresti fisicamente.
tipo:

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

quando quel valore è 1 (conta partizionando per prodotto) sei certo che è lo sconto migliore.
Se puoi passarmi dei dati posso provarla, così no, però provala e fammi sapere.

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Cavolo hai scritto una serie di cose che non conosco proprio in sql...
Prima di provarla vorrei studiarla un pò, così da capire anche cosa provo :D

Grazie mille, la studio, la provo e ti aggiorno! ;)

alx_81 Profilo | Guru

>Cavolo hai scritto una serie di cose che non conosco proprio
>in sql...
>Prima di provarla vorrei studiarla un pò, così da capire anche
>cosa provo :D
Allora, giusto per darti una mano, i punti sono due:
1 - campo calcolato on the fly
2 - ROW_NUMBER


1) Stiamo aggiungendo un campo calcolato al volo, senza persisterlo, perchè è solo una utilità di business che non ti serve persistere. In più, siccome la logica cambia spesso, non puoi dare da interfaccia una gestione complicando la vita al cliente. Considera poi che quelle logiche un giorno potrebbero cambiare, e cambiare una query è meglio che rifare parte dell'applicazione (visto che si tratta di utilità).

2) è una funzione di ranking, CONTA fino a che la chiave è uguale. Quando cambia, ricomincia. Guarda l'esempio:
CREATE TABLE #t (id int, sconto decimal(5,2)) INSERT INTO #t ( id, sconto ) VALUES ( 1, 10 ) , ( 2, 10.5 ) , ( 3, 5.5 ) , ( 4, 3.5 ) , ( 5, 8.5 ) , ( 1, 10 ) , ( 1, 10.5 ) , ( 2, 5.5 ) , ( 2, 3.5 ) , ( 3, 8.5 ) SELECT * , ROW_NUMBER() OVER (PARTITION BY id ORDER BY sconto DESC) FROM #t T DROP TABLE #t

>Grazie mille, la studio, la provo e ti aggiorno! ;)
ok facci sapere.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.microsoft.com/profiles/Alessandro.Alpi

zseven Profilo | Senior Member

Scusa se non ti ho fatto sapere, ma non ho avuto proprio tempo purtroppo...

Per ora ho mantenuto l'ipotesi che faccio vistare l'opzione, ma voglio riprendere appena riesco tutto l'aiuto che mi hai dato, anche per capire tutte queste altre nuove istruzioni che ignoro.

Grazie mille!
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