So there is school project and I completely stuck on last step. There's my code:
SELECT Consumidor.numero, Soma.soma
FROM Consumidor
JOIN
(SELECT compra.consumidor, SUM(Eco.eco*compra.quantidade) as soma
FROM compra
JOIN
(SELECT composto.produto, composto.prodMarca, Produto.nome,
sum(Elemento.pegadaEcologica * composto.percentagem/100) AS eco
FROM composto
JOIN Produto
ON composto.produto = Produto.codigo
AND composto.prodMarca = Produto.marca
JOIN Elemento
ON composto.elemento = Elemento.codigo
GROUP BY composto.produto, composto.prodMarca) Eco
ON compra.produto = Eco.produto AND compra.prodMarca = Eco.prodMarca
GROUP BY compra.consumidor) Soma
ON Consumidor.numero = Soma.Consumidor
So now I have table like:
Consumidor.number Soma.soma
123 90
456 70
789 70
Expected result should be Consumidor.number
(-s) where Soma.soma
is min.
I.e. for this table result should be:
Consumidor.number
456
789
There's original schema for all tables used in this query:
Consumidor (PK numero, email, sexo, nascimento)
Elemento (PK codigo, nome, pegadaEcologica, saude)
Produto (PK codigo, FK PK Marca.numero marca, nome, tipo, comercioJusto)
compra (FK PK Produto.codigo produto, FK PK Produto.marca prodMarca, Consumidor.numero, quantidade)
composto (FK PK Produto.codigo produto, FK PK Produto.marca prodMarca, FK PK Elemento.codigo elemento, percentagem)
Update. I didnt stuck with solution - there is solution:
SELECT Consumidor.numero, Soma.soma
FROM Consumidor
JOIN
(SELECT compra.consumidor, SUM(Eco.eco*compra.quantidade) as soma
FROM compra
JOIN
(SELECT composto.produto, composto.prodMarca, Produto.nome,
sum(Elemento.pegadaEcologica * composto.percentagem/100) AS eco
FROM composto
JOIN Produto
ON composto.produto = Produto.codigo
AND composto.prodMarca = Produto.marca
JOIN Elemento
ON composto.elemento = Elemento.codigo
GROUP BY composto.produto, composto.prodMarca) Eco
ON compra.produto = Eco.produto AND compra.prodMarca = Eco.prodMarca
GROUP BY compra.consumidor) Soma
ON Consumidor.numero = Soma.Consumidor
WHERE Soma.soma <= ALL
(SELECT SUM(Eco.eco*compra.quantidade) as soma
FROM compra
JOIN
(SELECT composto.produto, composto.prodMarca, Produto.nome,
sum(Elemento.pegadaEcologica * composto.percentagem/100) AS eco
FROM composto
JOIN Produto
ON composto.produto = Produto.codigo
AND composto.prodMarca = Produto.marca
JOIN Elemento
ON composto.elemento = Elemento.codigo
GROUP BY composto.produto, composto.prodMarca) Eco
ON compra.produto = Eco.produto AND compra.prodMarca = Eco.prodMarca
GROUP BY compra.consumidor)
Simply put whole Soma query onto WHERE clause. With this im getting expected resault. But this looks so ugly and im looking for some more elegant way.
P.S. Don't throw tomatoes - following project statement I'm not able to use sub-queries in FROM
clause, but if there are some observations about whole my code I will appreciate.
答案 0 :(得分:-1)
所以没有其他方法可以解决它
SELECT Consumidor.numero
FROM compra
JOIN Consumidor
ON compra.consumidor = Consumidor.numero
JOIN
(SELECT composto.produto, composto.prodMarca, Produto.nome,
sum(Elemento.pegadaEcologica * composto.percentagem/100) AS eco
FROM composto
JOIN Produto
ON composto.produto = Produto.codigo
AND composto.prodMarca = Produto.marca
JOIN Elemento
ON composto.elemento = Elemento.codigo
GROUP BY composto.produto, composto.prodMarca) Eco
ON compra.produto = Eco.produto AND compra.prodMarca = Eco.prodMarca
GROUP BY compra.consumidor
HAVING SUM(Eco.eco*compra.quantidade)<= ALL
(SELECT SUM(Eco.eco*compra.quantidade)
FROM compra
JOIN Consumidor
ON compra.consumidor = Consumidor.numero
LEFT JOIN Dependente
ON Dependente.consumidor = Consumidor.numero
JOIN
(SELECT composto.produto, composto.prodMarca, Produto.nome,
sum(Elemento.pegadaEcologica * composto.percentagem/100) AS eco
FROM composto
JOIN Produto
ON composto.produto = Produto.codigo
AND composto.prodMarca = Produto.marca
JOIN Elemento
ON composto.elemento = Elemento.codigo
GROUP BY composto.produto, composto.prodMarca) Eco
ON compra.produto = Eco.produto
AND compra.prodMarca = Eco.prodMarca
GROUP BY compra.consumidor);
要从当前表中获取具有最小值的字段,您必须在HAVING子句中查询整个表(检查当前表中所有组中compras的哪个组的SUM小于或等于所有组中的comp的SUM)。 它可以被标记为任何可能问题的副本。