【问题标题】:Join Two Tables with SUM on Second Table在第二个表上使用 SUM 连接两个表
【发布时间】:2021-09-30 22:02:42
【问题描述】:

这是一个愚蠢的问题,但我整天都在与它作斗争。

我有两张桌子。

products
+-----+---------+
| SKU | Quantity|
+-----+---------+
| ABC | 90      |
| DEF | 40      |
| XYZ | 33      |
+-----+---------+

    orders
    +-----+----------+
    | SKU | OrderID  |
    +-----+----------+
    | ABC | aaa      |
    | ABC | yyy      |
    | DEF | xxx      |
    | DEF | bbb      |
    | DEF | ccc      |
    +-----+----------+

我希望输出显示表 1 中的所有字段并匹配表 2 中的 SKU 计数的总和。如果表 2 中没有匹配项,它应该返回 null 或 0。所以输出应该是:

+-----+---------+-------+
| SKU | Quantity| Count +
+-----+---------+-------+
| ABC | 90      |  2    |
| DEF | 40      |  3    |
| XYZ | 33      |       |
+-----+---------+-------+

我写了以下查询(我使用的是 Laravel,请原谅 Laravel 语法)

$orders=Orders::groupBy('orders.SKU')
            ->selectRaw('sum(orders.quantity) as quantity_sum, orders.SKU');

$ordersAllProducts = DB::table('products')
    ->leftJoinSub($orders, 'orders', function ($join) {
        $join->on('products.SKU','=','orders.SKU');
    })->get();

它几乎可以工作,但我的 SKU 为空,如下所示。

+-----+---------+-------+
| SKU | Quantity| Count +
+-----+---------+-------+
| ABC | 90      |  2    |
| DEF | 40      |  3    |
|     | 33      |       |
+-----+---------+-------+

【问题讨论】:

  • 产品中的 SKU 是唯一的吗?
  • 是的,SKU 是一个独特的字段。

标签: sql laravel eloquent


【解决方案1】:

我可以为您提供本机查询以获取该 3 列结果(mysql 查询)

  • SKU
  • 数量
  • count ("-" if count = 0)
$sql = "select SKU, Quantity, 
    (select IF(count(*) > 0  , count(*), "-") from orders o where o.SKU = 
     p.SKU) as count
      from products  p" ;

$result = DB::select($sql);
dd($result);

如果您想为零计数返回 0 而不是“-”,只需从查询中删除(如果条件)

【讨论】:

    【解决方案2】:

    不完全熟悉这个 ORM 但我相信你应该在这里说products.SKU,而不是orders

    ->selectRaw('sum(orders.quantity) as quantity_sum, orders.SKU');
                                                       ^^^^^^^^^^
    

    每个连接都有两个边;一左一右。当您 LEFT JOIN 时,您实际上是在说“在左边给出每一行,在右边给出一个匹配的行,或者如果没有匹配则为 null”。订单来自连接的右侧,即偶尔为空的一侧

    【讨论】:

    • ps 如果您想要 0 而不是 null,请尝试将 sum(orders.quantity) as quantity_sum 替换为 coalesce(sum(orders.quantity),0) as quantity_sum
    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2020-06-29
    相关资源
    最近更新 更多