从SQL

时间:2018-02-24 13:00:15

标签: mysql sql aggregate-functions

SQL新手

条件:

  1. 查找每个区域的客户总数

  2. 查找每个区域的餐馆总数

  3. 餐馆销售的披萨最高价;如果该地区没有出售比萨饼的餐馆,那就是0。

  4. SQL查询中的表

    1. 喜欢(cname,披萨)

    2. 客户(cname,area)

    3. 餐馆(rname,area)

    4. 出售(rname,披萨,价格)

    5. 示例数据库架构供参考:http://sqlfiddle.com/#!9/d5cf74

      预期结果

      | area   | totalCustomer   | totalRest | MaxValue
      ----------------------------------------------
      | East  |      3           | 10        | 30
      | North |      2           | 20        | 10
      | South |      2           | 20        | 20
      | West  |      1           | 0         | 0
      

      当前结果

      | area   | totalCustomer   | totalRest | MaxValue
      ----------------------------------------------
      | East  |      3           | 5         | 30
      | North |      2           | 10        | 10
      | South |      2           | 10        | 20
      
      • 西区不在桌子内。

      • 我想拥有的是拥有客户的所有区域。他们是否在卖比萨饼。

      • 如果该特定餐厅不销售披萨,它仍将包含在餐厅总数中。

      • 如果该地区只有不卖披萨的餐馆,那么披萨的最大价值就是0.

      我的SQL代码:

      SELECT c.area, COUNT(DISTINCT c.cname), COUNT(DISTINCT r.area), MAX(s.price)
      FROM Customers c
      JOIN Restaurants r ON r.area = c.area
      JOIN Sells s ON r.rname = s.rname
      WHERE area = all(
      -- i'm thinking to use all to include every area that has customer. Whether or not it has any restaurants. 
      )
      GROUP BY c.area
      ;
      

1 个答案:

答案 0 :(得分:0)

'West'未显示的原因是您的上一次加入需要是外部的(默认情况下连接是内部的):

SELECT
    c.area
,   COUNT(DISTINCT c.cname)
,   COUNT(DISTINCT r.name)
,   MAX(COALESCE(s.price, 0))
FROM Customers c
LEFT OUTER JOIN Restaurants r ON r.area = c.area
LEFT OUTER JOIN Sells s ON r.rname = s.rname AND s.name='pizza'
GROUP BY c.area