有了这个db:
厨师( CID ,CNAME,年龄),
配方(远离,RNAME),
熟(订单ID ,CID,除掉,价格)
客户( CUID ,订单ID ,时间,白天,年龄)
[cid表示 c hef id ,依此类推]
鉴于客户的订单,我需要找到每个厨师,他的年龄与订购他/她的饭菜的人的平均数之间的差异。 我写了以下查询:
select cid, Ch.age - AVG(Cu.age) as Diff
from Chef Ch NATURAL JOIN Cooked Co,Customers Cu
where Co.orderid = Cu.orderid
group by cid
这解决了这个问题,但是如果你认为顾客有他们唯一的身份证,它可能不起作用,因为那时人们可以订购同一厨师的两顿饭并影响计算。
现在我知道它可以用NOT EXISTS回答,但我正在寻找一个包含按功能分组的灵魂(类似于我写的东西)。到目前为止,我无法找到(我搜索并尝试了很多方法,从选择不同,到where子句中的操作,到"有计数(不同......)")
编辑:人们要求做一个例子。我使用SQLFiddle进行编码并且崩溃很多,所以我会尽我所能:
cid | cuid | orderid | Cu.age
-----------------------------
1 333 1 20
1 200 2 41
1 200 5 41
2 4 3 36
让我们说厨师1的年龄是50岁。我的查询将给你50 - (20 + 40 + 40/3)= 16和2/3。虽然它应该实际上是50 - (20 + 40/2)= 20.(因为身份200的人订购了我们心爱的厨师1的两个食谱。)。 假设Chef 2的年龄是47岁。我的查询结果如下:
cid | Diff
----------
1 16.667
2 11
另一个编辑:我没有教过任何特定的sql-query表单。所以我真的不知道Oracle与MySql对Microsoft Server的区别是什么,所以我基本上是"自由泳"查询。(我希望我的考试也会很好:O)
答案 0 :(得分:0)
首先,您应该将查询编写为:
select cid, Ch.age - AVG(Cu.age) as Diff
from Chef Ch join
Cooked Co
on ch.cid = co.cid join
Customers Cu
on Co.orderid = Cu.orderid
group by cid;
两个不同的原因:
NATURAL JOIN
只是一个等待发生的错误。列出要用于连接的列,以免意外字段或拼写差异影响结果。FROM
子句中使用逗号。始终使用明确的JOIN
语法。接下来,您问题的答案会更复杂。对于每位厨师,我们可以通过以下方式获得客户的平均年龄:
select cid, avg(age)
from (select distinct co.cid, cu.cuid, cu.age
from Cooked Co join
Customers Cu
on Co.orderid = Cu.orderid
) c
group by cid;
然后,为了区别,您还需要提供这些信息。一种方法是在子查询中:
select cid, ( age - avg(cuage) ) as diff
from (select distinct co.cid, cu.cuid, cu.age as cuage, c.age as cage
from Chef c join
Cooked Co
on ch.cid = co.cid join
Customers Cu
on Co.orderid = Cu.orderid
) c
group by cid, cage;