我在选择时遇到了一些问题。我想确定类型为“ 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,那么我有它们,请告诉我,我也将发布它们。

最佳答案

您正在使用聚合功能(例如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或几乎任何其他数据库,则同一条语句将失败)。

关于mysql - SELECTS仅选择一个元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47758128/

10-11 03:37
查看更多