http://sqlfiddle.com/#!9/e6effb/1
我试图在12月份为法国每个品牌的收入排名前十。 有2个表(第一个表有日期,第二个表有品牌,我试图加入它们)
我收到此错误"功能db_9_d870e5.SUM不存在。检查'功能名称解析和解决方案'参考手册中的部分"
我对Inner join的使用是否正确?
答案 0 :(得分:0)
这是因为SUM
之后你有一个额外的空格。请从
SUM (o1.total_net_revenue)
至SUM(o1.total_net_revenue)
。
详细了解here。
在更正后,您的查询仍有更多错误,因为您未在中间表order_id
上选择i2
,因此在此处进行了编辑:
SELECT o1.order_id, o1.country, i2.brand,
SUM(o1.total_net_revenue)
FROM orders o1
INNER JOIN (
SELECT i1.brand, SUM(i1.net_revenue) AS total_net_revenue,order_id
FROM ordered_items i1
WHERE i1.country = 'France'
GROUP BY i1.brand
) i2
ON o1.order_id = i2.order_id AND o1.total_net_revenue = i2.total_net_revenue
AND o1.total_net_revenue = i2.total_net_revenue
WHERE o1.country = 'France' AND o1.created_at BETWEEN '2016-12-01' AND '2016-12-31'
GROUP BY 1,2,3
ORDER BY 4
LIMIT 10`
答案 1 :(得分:0)
- 编辑堆栈风扇是正确的,o2.total_net_revenue存在。我的困惑是因为数据结构在表之间重复了三列,包括正在寻找的一列。
您的SQL语句有几处错误:
<击> 1。您在外部select-SUM函数中引用了一个无效列。我相信你实际上是在i2.total_net_revenue之后。
表结构很糟糕,“重要”列(country,revenue,order_id)在两个表之间重复。我还希望收入列共享相同的名称,如果它们总是具有相同的值。在示例中,i1.net_revenue和o1.total_net_revenue之间没有区别。
在您的内连接中,您没有引用i1.order_id,这意味着您的“on”子句无法正确执行。
普罗蒂普: 当您遇到这样的问题时,请从查询中获取所有复杂的位,并首先使基本查询正常工作。然后添加你的功能。
普罗蒂普: 在GROUP BY子句中,引用实际列,而不是列号。它使您的查询更加健壮。
这是我最终的查询:
SELECT o1.order_id, o1.country, i2.brand,
SUM(i2.total_net_revenue) AS total_rev
FROM orders o1
INNER JOIN (
SELECT i1.order_id, i1.brand, SUM(i1.net_revenue) AS total_net_revenue
FROM ordered_items i1
WHERE i1.country = 'France'
GROUP BY i1.brand
) i2
ON o1.order_id = i2.order_id AND o1.total_net_revenue = i2.total_net_revenue
AND o1.total_net_revenue = i2.total_net_revenue
WHERE o1.country = 'France' AND o1.created_at BETWEEN '2016-12-01' AND '2016-12-31'
GROUP BY o1.order_id, o1.country, i2.brand
ORDER BY total_rev
LIMIT 10