【问题标题】:trouble formulating an sql query制定 sql 查询时遇到问题
【发布时间】:2013-11-25 03:04:37
【问题描述】:

我正在尝试制定一个查询,给定两个表:(1)销售人员,(2)销售;显示销售人员带来的 id、名称和销售额总和。问题是我可以获得带入资金的 id 和总和,但我不知道如何添加他们的名字。此外,我的尝试省略了不卖任何东西的销售人员,这是不幸的。

详细说明:

有两个简单的表:

create table Salespersons (
    id integer,
    name varchar(100)
);

create table Sales (
    sale_id integer,
    spsn_id integer,
    cstm_id integer, 
    paid_amt double
);

我想为每个销售员显示一个查询 他们带来的总销售额。

想到这个查询:

select spsn_id, sum(paid_amt) from Sales group by spsn_id

此查询仅返回 id 列表和总金额 在,但不是销售人员的姓名,它省略了 什么都不卖的销售人员。

如何查询 Salespersons 中的每个销售人员 表,打印他们的 ID、姓名、销售额总和,如果他们是 0 什么都没卖。

感谢您的帮助!

提前谢谢!

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    试试这个:

    SELECT sp.id,sp.name,SUM(NVL(s.paid_amt,0))
    FROM salespersons sp
    LEFT JOIN sales s ON sp.id = s.spsn_id
    GROUP BY sp.id, sp.name
    

    LEFT JOIN 将返回销售人员,即使他们没有销售。

    只要该用户没有销售,NVL 就会给你 0。

    【讨论】:

    • 这正是我想要的!非常感谢!
    【解决方案2】:

    试试下面的

    select sp.id, sp.name, sum(s.paid_amt)
      from salespersons sp
      left join sales s
        on sp.id = s.spsn_id
     group by sp.id, sp.name
    

    【讨论】:

    • 已更新,因为我忘记包含 id :P,它应该保留加入,因为销售人员可能没有销售
    【解决方案3】:

    或者试试这个:

    with t as
    (select spsn_id, sum(paid_amt) as totamt
      from Sales 
      group by spsn_id 
    )
    select sp.id, sp.name, coalesce( t.totamt, 0 )
      from salespersons sp
      left join t  ON sp.id = t.spsn_id
    

    哪个(理论上)在加入之前进行分组,从而节省时间。

    Coalesce 在这里与 NVL 做同样的事情,但更便携。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 2019-12-10
      相关资源
      最近更新 更多