带max和count的澄清问题(sql)

nuypyhwy  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(352)

我正在做一些家庭作业问题,有点困惑如何使用计数和最大在我的查询。我想知道是否有人能向我解释其中的“where”部分,或者我只是把代码写得完全错了:
目录关系列出了供应商对零件收取的价格。catalog.pid是parts.pid的外键。catalog.sid是suppliers.sid的外键。用sql编写以下查询。执行它们以确保你得到正确的答案。复制sql查询并将结果的屏幕截图作为答案。不要列出返回结果中未指定的其他属性。
目录包含:pid、sid、cost
零件包括:pid、pname、color
供应商名称:sid、sname、地址
c(2分)返回唯一零件的编号。

select count (distinct *) from Parts;

--这会在select上产生编译错误,有人对此有建议吗?
一(1分)在所有供应商中找出该零件的pids、pnames和最大成本。

select p.pid, p.pname, c.cost from Parts p 
  inner join Catalog c on c.sid = p.pid
  inner join Suppliers s on c.pid = s.sid
  where max(c.cost);

我不完全确定我是否正确地开始这一点,我不知道什么时候考虑做'哪里'的一部分。。总是需要吗?

bd1hkmkf

bd1hkmkf1#

对于不同的零件id,零件由id标识

select count(distinct pid) from Parts;

或者,如果pid是自动递增的,则可以将行

select count(*) from Parts;

在where条件下不应使用聚合函数..例如: where max(c.cost) 在执行aggreagtion函数之前首先计算中的where条件,因此如果要对应该使用的聚合结果进行筛选,则where子句不能知道max()的值
having c.cost = max(c.cost) 但是在这种情况下,对于select中的非聚合列,如果没有groupby,就不能使用聚合函数并获取另一种类型的错误。
但如果还需要其他列,可以使用子查询

select p.pid, p.pname, c.cost 
    from Parts p 
    inner join Catalog c on c.sid = p.pid
    inner join Suppliers s on c.pid = s.sid
    inner join  (
        select max(cost) max_cost
        from Catalog
    ) t on t.max_cost = c.cost
b1zrtrql

b1zrtrql2#

select count(distinct pid) from parts.

在上述情况下,distinct是不必要的,因为pid很可能是部件的主键。所以,上述结果应该和

select count(pid) from parts.

第二个查询不需要与供应商连接,因为它跨所有供应商。

select p.pid, p.name, max(c.cost)
from parts p left join catalog c
on p.pid=c.pid
group by 1, 2

相关问题