Newsgroup: it.comp.software.database
Titolo: Mysql query

Ho queste tabelle :
Prodotti
| id   | nome   |
| 1    | pane     |
| 2    | vino       |
| 3    | latte      |
| 4    | sale     |
Acquisti
| id | prodotto_id | q.ta acqustata   |
| 1 | 1                  | 20                      |
| 1 | 2                  | 30                      |
| 2 | 3                  | 10                      |
| 3 | 2                  | 100                    |
| 3 | 1                  | 50                      |
| 3 | 2                  | 30                      |
Vendite
| id | prodotto_id | q.ta venduta     |
| 1 | 3                  | 20                      |
| 1 | 1                  | 30                      |
| 2 | 2                  | 10                      |
| 3 | 3                  | 40                      |
| 3 | 2                  | 60                      |
| 4 | 1                  | 30                      |
Mi potete aiutare con una stringa SQL ( in MySQL) ad avere questo risultato
:
| nome prodotto | somma_acquistata | somma_venduta |
| latte                | 10                        | 60
|
| pane               | 70                        | 60                      |
| sale                 | 0                         | 0
|
| vino                 | 160                      | 70
|
Grazie  a tutti

 Ho queste tabelle :
Qualcosa del tipo...
Select p.nome, q1.quantita_acquistata, q2.quantita_venduta
from prodotti p, acquisti q1, vendite q2
where 
p.id
=q1.id_prodotto and
p.id
=q2.id_prodotto
Davide

 ha scritto nel messaggio
news:atl430$5229$1...@ID-18487.news.dfncis.de...


 Ci avevo provato anch'io ma le somme non sono OK.
Mi mancava la parte delle somme.
Aggiungi un bel group by 
p.id
.
Davide

 ha scritto nel messaggio
news:atl78p$7hou$1...@ID-18487.news.dfncis.de...


 group by 
p.id
Se fai cosi' devi fare il group by per p.nome.
Il group by deve essere fatto con un campo che e'
nell'elenco di "select".
Davide

 nell'elenco di "select".
.................
Ma tu l'hai testato o no?
NON FUNZIONA.
ne
Select p.nome, sum(q1.qu_acq), sum(q2.qu_ven)
from prodotti p, acquisti q1, vendite q2
where 
p.id
=q1.id_prodotto and
p.id
=q2.id_prodotto
group by p.nome
ne
Select 
p.id
, sum(q1.quacq), sum(q2.quven)


 ha
scritto:

IL problema secondo me non è risolvibile con un'unica query
perchè le vendite e gli acquisti sono indipendenti tra loro
e sono in join con la stessa tabella (prodotti)
ma cmq non ne sono sicuro
Il problema l'ho risolto con due query
la prima (che ho chiamato q1) è:
SELECT [Prodotti].[IDProdotto] AS IDProdotto, [Prodotti].[Nome] AS
Nome_Prodotto, Sum([Acquisti].[Qtà_Acquistata]) AS somma_acquistata
FROM Prodotti LEFT JOIN Acquisti ON
[Prodotti].[IDProdotto]=[Acquisti].[IDProdotto]
GROUP BY [Prodotti].[Nome], [Prodotti].[IDProdotto];
la seconda, che fa riferimento alla prima è
SELECT q1.Nome_Prodotto,first(q1.somma_acquistata) AS Somma_acquistata,
Sum(vendite.Qtà_Venduta) AS somma_vendute
FROM q1 inner JOIN vendite ON q1.IDProdotto = vendite.IDProdotto
GROUP BY q1.Nome_Prodotto;
che mi dà il risultato sperato
PS. l'ho fatto in access non so se con il tuo dbms esiste la funzione first
(che in access mi restituisce solo il primo record di un set di record di un
raggruppamento)
ah! ho cambiato qualche nome ai campi ! pardon
Teoricamente si sarebbe potuto mettere tutto in una query
ma access non supporta il join tra una subquery e una tabella
ciao
fabguitar
--------------------------------
Inviato via 
http://usenet.libero.it

 wrote in message
news:cpnL9.25490$ab2.8...@news1.tin.it...
Ciao,
premetto che non conosco MySql ma penso sia possibile ottenere il risultato
che desideri utilizzando istruzioni ANSI SQL-92.
Ho fatto un esempio in Transact-SQL e credo che possa funzionare senza
problemi anche con MySql.
USE Northwind
GO
-- Creo le tabelle
CREATE TABLE dbo.Prodotti(
ProdottoID int NOT NULL IDENTITY PRIMARY KEY,
Nome varchar(10) NOT NULL
)
GO
CREATE TABLE dbo.Acquisti(
AcquistoID int NOT NULL IDENTITY PRIMARY KEY,
ProdottoID int NOT NULL,
QtaAcquistata int NOT NULL
)
GO
CREATE TABLE dbo.Vendite(
VenditaID int NOT NULL IDENTITY PRIMARY KEY,
ProdottoID int NOT NULL,
QtaVenduta int NOT NULL
)
GO
-- Le popolo
SET NOCOUNT ON
INSERT dbo.Prodotti VALUES('pane')
INSERT dbo.Prodotti VALUES('vino')
INSERT dbo.Prodotti VALUES('latte')
INSERT dbo.Prodotti VALUES('sale')
INSERT dbo.Acquisti VALUES(1, 20)
INSERT dbo.Acquisti VALUES(2, 30)
INSERT dbo.Acquisti VALUES(3, 10)
INSERT dbo.Acquisti VALUES(2, 100)
INSERT dbo.Acquisti VALUES(1, 50)
INSERT dbo.Acquisti VALUES(2, 30)
INSERT dbo.Vendite VALUES(3, 20)
INSERT dbo.Vendite VALUES(1, 30)
INSERT dbo.Vendite VALUES(2, 10)
INSERT dbo.Vendite VALUES(3, 40)
INSERT dbo.Vendite VALUES(2, 60)
INSERT dbo.Vendite VALUES(1, 30)
SET NOCOUNT OFF
GO
-- Creo una vista per facilitare la lettura
-- della query (ma non è indispensabile)
CREATE VIEW dbo.vwDati
AS
SELECT ProdottoID, QtaAcquistata, NULL QtaVenduta
FROM dbo.Acquisti
UNION ALL
SELECT ProdottoID, NULL, QtaVenduta
FROM dbo.Vendite
GO
--Query
SELECT P.Nome 'Nome Prodotto',
CASE
   WHEN SUM(D.QtaAcquistata) IS NULL THEN 0
   ELSE SUM(D.QtaAcquistata)
END 'Somma Qta Acquistata',
CASE
   WHEN SUM(D.QtaVenduta) IS NULL THEN 0
   ELSE SUM(D.QtaVenduta)
END 'Somma Qta venduta'
FROM dbo.Prodotti P LEFT JOIN dbo.vwDati D
ON P.ProdottoID = D.ProdottoID
GROUP BY P.Nome
Se preferisci non creare la vista, puoi semplicemente copiare il codice
direttamente nella query:
SELECT P.Nome 'Nome Prodotto',
CASE
   WHEN SUM(D.QtaAcquistata) IS NULL THEN 0
   ELSE SUM(D.QtaAcquistata)
END 'Somma Qta Acquistata',
CASE
   WHEN SUM(D.QtaVenduta) IS NULL THEN 0
   ELSE SUM(D.QtaVenduta)
END 'Somma Qta venduta'
FROM dbo.Prodotti P LEFT JOIN (
   SELECT ProdottoID, QtaAcquistata, NULL QtaVenduta
   FROM dbo.Acquisti
   UNION ALL
   SELECT ProdottoID, NULL, QtaVenduta
   FROM dbo.Vendite
) D
ON P.ProdottoID = D.ProdottoID
GROUP BY P.Nome
Ciao!
--
Lorenzo Benaglia
UGIdotNET - 
http://www.ugidotnet.org
UGISS - 
http://www.ugiss.org

 Grazie  a tutti
Prego. Mandi a tutti by Meris. :)