【问题标题】:Joining two tables with a queried table使用查询表连接两个表
【发布时间】:2011-02-15 03:23:02
【问题描述】:

哦,伟大的 SQL 大神,我需要您的帮助。

这是我的架构:

CAR(Serial_no,Model,Manufacturer,Price)
OPTIONS(Serial_no,Option_name,Price)
SALE(Salesperson_id,Serial_no,Date,Sale_price)
SALESPERSON(Salesperson_id,Name,Phone)
  1. 首先,我需要通过 Serial_no 加入 CAR 和 SALE 表。
  2. 其次,我需要获取 OPTIONS 表并对类似 Serial_no 的所有价格求和,如下所示:

    选择 O.Serial_no, SUM(O.Price) 从选项 O GROUP BY (O.Serial_no);

  3. 最后,我需要合并步骤 1 和步骤 2 并查询结果,以便获得 CAR.Price

这可以吗?任何帮助将不胜感激!

谢谢, 标记

【问题讨论】:

  • 嗨,到目前为止我已经尝试过了SELECT C.Serial_no, C.Price, S.Sale_price, SUM(O.Price) AS Cost FROM (CAR C, SALE S) LEFT OUTER JOIN OPTIONS O ON C.Serial_no = O.Serial_no WHERE C.Serial_no = S.Serial_no AND C.Price
  • 每辆车只有一次销售吗?
  • 选项中每个序列号有多个条目。似乎有一个棘手的部分,因为我必须将类似 Serial_no 的价格加起来

标签: sql mysql


【解决方案1】:
SELECT C.Serial_no,
  MIN(c.Price) CarPrice,
  MIN(s.Sale_price) SalePrice,
  SUM(o.Price) OptionsPrice,
  MIN(s.Sale_price) + IFNULL(SUM(o.Price),0) TotalPrice
FROM Car c JOIN Sale s ON c.Serial_no = s.Serial_no
  LEFT JOIN `Options` o ON c.Serial_no = o.Serial_no
GROUP BY c.Serial_no
HAVING MIN(c.Price) < MIN(s.Sale_price) + IFNULL(SUM(o.Price),0)

注意:MIN() 并没有带走任何东西,它只是因为您正在分组,并且选项表可能有多行。

另一种选择是在子查询中进行计算,这可能会带来更好的性能:

SELECT C.Serial_no,
  C.Price,
  S.Sale_price,
  og.SumPrice
FROM Car c JOIN Sale s ON c.Serial_no = s.Serial_no
  LEFT JOIN (
    SELECT Serial_no, SUM(Price) SumPrice
    FROM `Options`
    GROUP BY Serial_no
  ) og ON c.Serial_no = og.Serial_no
WHERE c.Price < s.Sale_price + IFNULL(og.SumPrice,0)

【讨论】:

  • 这似乎没有为我编译 :( SELECT C.Serial_no, MIN(C.Price), SUM(O.Price) FROM CAR C JOIN SALE S USING(Serial_no) LEFT JOIN OPTIONS O ON USING(Serial_no) GROUP BY C.Serial_no HAVING MIN(C.Price)
  • @mark-anderson 更新了查询。您收到了哪些错误消息?
  • 我认为是别名不一致。您已将子查询别名为o,并将其引用一次为o,两次引用为og
  • @andriy-m 已更新。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2014-11-07
  • 2016-05-27
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多