分组后消除某些重复的行

时间:2016-01-28 13:09:56

标签: mysql sql group-by duplicates distinct

有了这个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)

1 个答案:

答案 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;