带有数据透视表和多个连接的Mysql查询

时间:2018-01-20 10:48:43

标签: mysql sql

我有一个sales表,一个sale_staff表,一个staff表和一个offices表。

我们正在销售房产,我想知道X月和每个办公室的每个卖家的销售数量。

数据透视表看起来像这样

sale_id , staff_id , type

type可以是sellerlister,因此我需要一个where子句。

sales表对offices表有一个FK; office_id

到目前为止我所知道的是,我知道它完全错了,但这就是为什么我在这里 - 我需要修理这笔款项并在办公室桌面上加上办公室名称,所以

 select st.first_name, st.last_name, office, count(*) as sold
from sales s, sale_staff ss
left join staff st 
on st.id = ss.staff_id
left join offices off
on off.id = s.office_id
where ss.`type` = 'lister' and
year(s.sale_date) = 2017 and
month(s.sale_date) = 12
group by st.id

销售表只是一个物业销售项目,价格,地址,office_id。

除了错误unknown column s.office_id之外,正如我所说,总和值无论如何都是错误的。我真的没有足够的经验来理解这种级别的关系加入和聚合,请指点。

基本上我想简单地看一下像

这样的结果集
staff(seller) , count , office
 Mike         ,   12  ,  West
 Jim          ,   7   ,  East
 Fred         ,   3   ,  East

编辑:SQLFiddle如果有帮助:)将添加一些示例测试数据。

1 个答案:

答案 0 :(得分:1)

从不FROM子句中使用逗号。 始终使用正确的,明确的JOIN语法。你的问题是因为逗号的范围规则。

我建议:

select st.first_name, st.last_name, o.office, count(*) as sold
from staff st left join
     sale_staff ss
     on st.id = ss.staff_id join
     sales sa
     on sa.sale_id = ss.sale_id join
     offices o
     on o.id = s.office_id
where ss.`type` = 'lister' and
      s.sale_date >= '2017-12-01' and
      s.sale_date < '2018-01-01'
group by st.first_name, st.last_name, o.office;

我认为这有正确的连接条件,但很难确定没有样本数据和期望的结果。

注意:

  • left join可能没有必要。如果是,你可能应该从员工表开始(以保留所有员工)。
  • 限定所有列名称。
  • group by包含from中的所有非汇总列。如果你正在学习SQL,这是一个好习惯。
  • 日期比较是直接的,不使用功能。