我对这个选择有一些问题。我想确定“lar”类型的每个产品的“pegadaecológica”。 通过这个选择我能够得到第一个类型为“lar”的产品,但我想要每个产品。我不知道这是怎么发生的。
SELECT DISTINCT P.codigo as "Código Produto",
SUM(Compra.quantidade)*SUM(Composto.percentagem)*SUM(E.pegadaEcologica) as "Pégada Ecológica"
FROM Produto P, Elemento E, composto Composto, compra Compra
WHERE P.tipo = 'lar' AND P.codigo = Composto.produto
AND Composto.elemento = E.codigo AND P.marca = Composto.prodMarca
我的表格:
Create table Elemento (
codigo char(3),
nome varchar(25) not null,
pegadaEcologica int(2) not null,
saude int(2) not null,
constraint pk_Elemento primary key (codigo)
);
Create table Produto (
codigo int(6),
marca int(7),
nome varchar(50) not null,
tipo char(10),
comercioJusto char(1),
constraint Produto_tipo_RI004 check (tipo in ('alimentac','lar','jardim','automov','viagem','electrodom')),
constraint Produto_comercioJusto_RI005 check (comercioJusto in ('A','B','C','D')),
constraint fk_Produto_marca foreign key (marca) references Marca(numero) on delete cascade,
constraint pk_Produto primary key (codigo,marca)
);
Create table compra (
produto int(6),
prodMarca int(7),
consumidor int(9),
quantidade decimal(10,3) not null,
constraint compra_quantidade_RI006 check (quantidade>0),
constraint fk_compra_produto foreign key (produto,prodMarca) references Produto(codigo,marca) on delete cascade,
constraint fk_compra_consumidor foreign key (consumidor) references Consumidor(numero) on delete cascade,
constraint pk_compra primary key (produto,prodMarca,consumidor)
);
Create table composto (
produto int(6),
prodMarca int(7),
elemento char(3),
percentagem decimal(4,1) not null,
constraint composto_percentagem_RI007 check (percentagem>0 and percentagem<=100),
constraint fk_composto_produto foreign key (produto,prodMarca) references Produto(codigo,marca) on delete cascade,
constraint fk_composto_elemento foreign key (elemento) references Elemento(codigo) on delete cascade,
constraint pk_composto primary key (produto,prodMarca,elemento)
);
注意:如果你需要INSERT,我有它们,请告诉我,我也会发布。
答案 0 :(得分:1)
您正在使用sum()
,avg()
,max()
,group_concat()
等类似的聚合函数聚合某些数据。在你的情况下:
SUM(Compra.quantidade)*SUM(Composto.percentagem)*SUM(E.pegadaEcologica)
您还在选择要对聚合数据进行分组的字段。
P.codigo as "Código Produto",
为此,您必须在查询末尾的GROUP BY
子句中指定非聚合字段。该子句告诉数据库汇总到GROUP BY中每个不同字段组合的级别。
SELECT P.codigo as "Código Produto",
SUM(Compra.quantidade)*SUM(Composto.percentagem)*SUM(E.pegadaEcologica) as "Pégada Ecológica"
FROM Produto P, Elemento E, composto Composto, compra Compra
WHERE P.tipo = 'lar' AND P.codigo = Composto.produto
AND Composto.elemento = E.codigo AND P.marca = Composto.prodMarca
GROUP BY P.codigo
您必须像我一样删除DISTINCT
关键字。 Distinct类似于GROUP BY,但只有在不使用任何聚合函数时才使用它。
最后,对5.7及更高版本的MySQL默认设置进行了更改,使其与大多数其他RDBMS产品保持一致。在较新版本中,您必须在GROUP BY子句中包含非聚合字段,否则解析器将拒绝您的查询。因此,我们鼓励您始终在GROUP BY中包含所有非聚合字段。它有助于将来证明您的SQL并使其更具可移植性(如果您将其移植到Postgres或Oracle或SQL Server或几乎任何其他数据库,则相同的语句将失败。)