Filtro su tabella da impazzire

giovedì 21 gennaio 2010 - 17.35

dotnetnapo Profilo | Junior Member

Un saluto a tutti, ho un problema che mi sta attanagliando sperando che qualcuno me lo risolva, vado al dunque....

Ho questa tabella:

ID| AZIENDA | PRODOTTO | PREZZO
---------------------------------------------
1 | AZIENDA 1 | Orologio Tipo 1 | 500
2 | AZIENDA 1 | Orologio Tipo 2 | 300
3 | AZIENDA 1 | Orologio Tipo 3 | 200
4 | AZIENDA 1 | Collana Tipo 1 | 100
5 | AZIENDA 1 | Collana Tipo 2 | 400
6 | AZIENDA 1 | Collana Tipo 3 | 200
7 | AZIENDA 2 | Collana Tipo 1 | 150
8 | AZIENDA 2 | Collana Tipo 2 | 350
9 | AZIENDA 2 | Collana Tipo 3 | 900
10 | AZIENDA 2 | Orologio Tipo 1 | 900
11 | AZIENDA 2 | Orologio Tipo 2 | 800
12 | AZIENDA 2 | Orologio Tipo 3 | 700
13 | AZIENDA 3 | Orologio Tipo 3 | 700
13 | AZIENDA 3 | Bracciale Tipo 1 | 700

Il problema è il seguente: passo due parametri esempio collane e orologi, come faccio ad estrarre tutte le aziende che hanno collane e orologi con il prezzo più basso e visualizzarli? Se un'azienda ha solo collane non mi interessa deve avere tutti e due i prodotti. In pratica voglio ottenere il seguente risultato:

3 | AZIENDA 1 | Orologio Tipo 3 | 200
4 | AZIENDA 1 | Collana Tipo 1 | 100
7 | AZIENDA 2 | Collana Tipo 1 | 150
12 | AZIENDA 2 | Orologio Tipo 3 | 700

In questo caso azienda 3 non risponde alle mie richieste.

Ci sto impazzendo grazie....

lbenaglia Profilo | Guru

>Un saluto a tutti, ho un problema che mi sta attanagliando sperando
>che qualcuno me lo risolva, vado al dunque....
>
>Ho questa tabella:
>
>ID| AZIENDA | PRODOTTO | PREZZO
>---------------------------------------------
>1 | AZIENDA 1 | Orologio Tipo 1 | 500
>2 | AZIENDA 1 | Orologio Tipo 2 | 300
>3 | AZIENDA 1 | Orologio Tipo 3 | 200
>4 | AZIENDA 1 | Collana Tipo 1 | 100
>5 | AZIENDA 1 | Collana Tipo 2 | 400
>6 | AZIENDA 1 | Collana Tipo 3 | 200
>7 | AZIENDA 2 | Collana Tipo 1 | 150
>8 | AZIENDA 2 | Collana Tipo 2 | 350
>9 | AZIENDA 2 | Collana Tipo 3 | 900
>10 | AZIENDA 2 | Orologio Tipo 1 | 900
>11 | AZIENDA 2 | Orologio Tipo 2 | 800
>12 | AZIENDA 2 | Orologio Tipo 3 | 700
>13 | AZIENDA 3 | Orologio Tipo 3 | 700
>13 | AZIENDA 3 | Bracciale Tipo 1 | 700

Che DBMS utilizzi?
Qual è la Primary Key?
Quella "tabella" non è conforme alla prima forma normale, pertanto la vedo dura estrarre qualcosa di sensato.
Per iniziare la colonna Prodotto va spezzettata in 2: Prodotto (Collana, Orologio, Bracciale) e Tipologia (1, 2, 3) inoltre dovresti definire n tabelle anagrafiche da mettere in relazione 1-a-molti con quella postata.

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

dotnetnapo Profilo | Junior Member

Hai ragione, ho messo quella tabella per rendere semplice la cosa, naturalmente ci sono più tabelle sia per le aziende che per i prodotti, ma la cosa non cambia alla fine la tabella interessata è la seguente:

ID| AZIENDA | PRODOTTO | PREZZO
---------------------------------------------
1 | IDAZ1 | ORO1 | 500
2 | IDAZ1 | ORO2 | 300
3 | IDAZ1 | ORO3 | 200
4 | IDAZ1 | COLL1 | 100
5 | IDAZ1 | COLL2 | 400
6 | IDAZ1 | COLL3 | 200
7 | IDAZ2 | COLL1 | 150
8 | IDAZ2 | COLL2 | 350
9 | IDAZ2 | COLL3 | 900
10 | IDAZ2 | ORO1 | 900
11 | IDAZ2 | ORO2| 800
12 | IDAZ2 | ORO3 | 700
13 | IDAZ2| ORO3 | 700
13 | IDAZ3 | BRAC1 | 700

Adesso il risultato che cerco è: QUALI SONO LEAZIENDE CHE VENDONO OROLOGI (ORO) E COLLANE (COLL) A PREZZO PIU' BASSO? Se un'azienda ha uno solo di qs prodotti e non l'altro non mi interessa..... Il risultato deve essere:

3 | IDAZ1 | ORO3 | 200
6 | IDAZ1 | COLL3 | 200
7 | IDAZ2 | COLL1 | 150
12 | IDAZ2 | ORO3 | 700

Grazie

DATABASE USATO: MYSQL 5+

lbenaglia Profilo | Guru

>Hai ragione, ho messo quella tabella per rendere semplice la
>cosa, naturalmente ci sono più tabelle sia per le aziende che
>per i prodotti, ma la cosa non cambia alla fine la tabella interessata
>è la seguente:
>
>ID| AZIENDA | PRODOTTO | PREZZO
>---------------------------------------------
>1 | IDAZ1 | ORO1 | 500
>2 | IDAZ1 | ORO2 | 300
>3 | IDAZ1 | ORO3 | 200
>4 | IDAZ1 | COLL1 | 100
>5 | IDAZ1 | COLL2 | 400
>6 | IDAZ1 | COLL3 | 200
>7 | IDAZ2 | COLL1 | 150
>8 | IDAZ2 | COLL2 | 350
>9 | IDAZ2 | COLL3 | 900
>10 | IDAZ2 | ORO1 | 900
>11 | IDAZ2 | ORO2| 800
>12 | IDAZ2 | ORO3 | 700
>13 | IDAZ2| ORO3 | 700
>13 | IDAZ3 | BRAC1 | 700
>
>Adesso il risultato che cerco è: QUALI SONO LEAZIENDE CHE VENDONO
>OROLOGI (ORO) E COLLANE (COLL) A PREZZO PIU' BASSO?

Il problema è che non esiste una colonna contenente ORO o COLL ma OROx e COLLx.
Il design di quella tabella è errato oppure è errato l'uso che ne vuoi fare.

Volendo è possibile ottenere quello che cerchi utilizzando l'operatore LIKE ma non vedo perché intraprendere una strada arzigogolata quando l'errore è alla base.

>Grazie
Prego.

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

dotnetnapo Profilo | Junior Member

Se cambio la tab in qs modo cosa cambia?

ID| IDAZIENDA | ID PRODOTTO | PRODOTTO | PREZZO
---------------------------------------------
1 | IDAZ1 | ORO | Descriz 1| 500
2 | IDAZ1 | ORO | Descriz 2| 300
3 | IDAZ1 | ORO | Descriz 3| 200
4 | IDAZ1 | COLL | Descriz 4| 100
5 | IDAZ1 | COLL | Descriz 5| 400
6 | IDAZ1 | COLL | Descriz 6| 200
7 | IDAZ2 | COLL | Descriz 7| 150
8 | IDAZ2 | COLL | Descriz 8| 350
9 | IDAZ2 | COLL | Descriz 9| 900
10 | IDAZ2 | ORO | Descriz 10| 900
11 | IDAZ2 | ORO | Descriz 11| 800
12 | IDAZ2 | ORO | Descriz 12| 700
13 | IDAZ2| ORO | Descriz 13| 700
13 | IDAZ3 | BRAC | Descriz 14| 700

Si può fare? voglio estrarre la lista dei prodotti a prezzo più basso (ATTENZIONE LA LISTA DEI PRODOTTI!!!!) delle aziende che hanno sia ORO che COLL.

gRAZIE

lbenaglia Profilo | Guru

>Si può fare? voglio estrarre la lista dei prodotti a prezzo più
>basso (ATTENZIONE LA LISTA DEI PRODOTTI!!!!) delle aziende che
>hanno sia ORO che COLL.

In SQL Server farei così:

USE tempdb; CREATE TABLE dbo.foo( ID int NOT NULL PRIMARY KEY, IDAZIENDA char(5) NOT NULL, IDPRODOTTO varchar(5) NOT NULL, PRODOTTO varchar(10) NOT NULL, PREZZO int NOT NULL ); INSERT dbo.foo VALUES (1, 'IDAZ1', 'ORO', 'Descriz 1', 500) ,(2, 'IDAZ1', 'ORO', 'Descriz 2', 300) ,(3, 'IDAZ1', 'ORO', 'Descriz 3', 200) ,(4, 'IDAZ1', 'COLL', 'Descriz 4', 100) ,(5, 'IDAZ1', 'COLL', 'Descriz 5', 400) ,(6, 'IDAZ1', 'COLL', 'Descriz 6', 200) ,(7, 'IDAZ2', 'COLL', 'Descriz 7', 150) ,(8, 'IDAZ2', 'COLL', 'Descriz 8', 350) ,(9, 'IDAZ2', 'COLL', 'Descriz 9', 900) ,(10, 'IDAZ2', 'ORO', 'Descriz 10', 900) ,(11, 'IDAZ2', 'ORO', 'Descriz 11', 800) ,(12, 'IDAZ2', 'ORO', 'Descriz 12', 700) ,(13, 'IDAZ2', 'ORO', 'Descriz 13', 700) ,(14, 'IDAZ3', 'BRAC', 'Descriz 14', 700); WITH CTE_GetKey(IDAZIENDA, IDPRODOTTO, PREZZO) AS ( SELECT IDAZIENDA , IDPRODOTTO , MIN(PREZZO) FROM dbo.foo WHERE IDPRODOTTO IN('ORO', 'COLL') GROUP BY IDAZIENDA, IDPRODOTTO ) SELECT F.* FROM dbo.foo AS F JOIN CTE_GetKey AS C ON F.IDAZIENDA = C.IDAZIENDA AND F.IDPRODOTTO = C.IDPRODOTTO AND F.PREZZO = C.PREZZO; /* Output: ID IDAZIENDA IDPRODOTTO PRODOTTO PREZZO ----------- --------- ---------- ---------- ----------- 4 IDAZ1 COLL Descriz 4 100 3 IDAZ1 ORO Descriz 3 200 7 IDAZ2 COLL Descriz 7 150 12 IDAZ2 ORO Descriz 12 700 13 IDAZ2 ORO Descriz 13 700 (5 row(s) affected) */ DROP TABLE dbo.foo;

>gRAZIE
Prego.

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

dotnetnapo Profilo | Junior Member

Con mysql ???

lbenaglia Profilo | Guru

>Con mysql ???
Boh, non lo conosco
Il concetto è definire una tabella derivata che restituisca "la chiave" ed eseguire una banale INNER JOIN con la tabella base.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
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