【问题标题】:Laravel SUM of multiple fields return null with raw query多个字段的 Laravel SUM 使用原始查询返回 null
【发布时间】:2016-06-11 20:40:01
【问题描述】:

以下是我的查询:

 $sales = DB::table('sales')
        ->leftJoin('category_sales', 'category_sales.sale_id', '=', 'sales.id')
        ->leftJoin('department_sales', 'department_sales.sale_id', '=', 'sales.id')
        ->leftJoin('store_configs', 'store_configs.id', '=', 'sales.store_config_id')
        ->select('sales.date',
            DB::raw('store_configs.store_dba'),
            DB::raw('sales.id'),
            DB::raw('(sales.taxable + sales.non_taxable + category_sales.amount + department_sales.amount) as total_sales'),
            DB::raw('0.0825*(sales.taxable + category_sales.amount + department_sales.amount) as total_tax'))
        ->groupBy('date')->orderBy('date', 'desc')
        ->get();

当我在category_sales and department_sales 表上有值时,我得到了正确的值。可以说,我没有任何 amount value for the sales_id in category_sales 表,total_salestotal_tax 的最终结果为空。

我的问题是:如果数据存在,我将如何对字段的值求和?

taxable, non_taxable, and amount'

category_sales and department_sales 是整数,defaults0

我的表结构只是一个想法,和department_sales类似:

CREATE TABLE `category_sales` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`amount` int(11) NOT NULL DEFAULT '0',
`category_id` int(10) unsigned DEFAULT NULL,
`sale_id` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `category_sales_category_id_index` (`category_id`),
KEY `category_sales_sale_id_index` (`sale_id`),
CONSTRAINT `category_sales_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE,
CONSTRAINT `category_sales_sale_id_foreign` FOREIGN KEY (`sale_id`) REFERENCES `sales` (`id`) ON DELETE CASCADE) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

【问题讨论】:

  • 所以如果没有数据,你想看到“0”而不是 null 吗?你的问题有类型吗?
  • 可以说,如果任何字段为 null 或为空或不存在,我需要获取那些具有值的字段的总和。

标签: php mysql database laravel-5 eloquent


【解决方案1】:

您可以将可为空的字段包装到 IFNULL() 函数中,如下所示:

DB::raw('(IFNULL(sales.taxable,0)
 + IFNULL(sales.non_taxable,0)
 + IFNULL(category_sales.amount,0)
 + IFNULL(department_sales.amount,0)
) as total_sales'),
DB::raw('0.0825*(IFNULL(sales.taxable,0) 
 + IFNULL(category_sales.amount,0)
 + IFNULL(department_sales.amount,0)) as total_tax'))

【讨论】:

  • 谢谢@amaksr。我之前尝试过 If,但没有以正确的方式进行。
  • 你的回答让我离开了那个阶段,但我一直在哭着要通过另一个步骤在 stackoverflow 中解决另一个问题,如果你有时间,我将不胜感激。 stackoverflow.com/questions/37776675/… 谢谢,
【解决方案2】:

使用 IFNULL 检查并转换为 0

 DB::raw('(IFNULL(sales.taxable,0)+ IFNULL(sales.non_taxable,0) + IFNULL(category_sales.amount,0) + IFNULL(department_sales.amount,0)) as total_sales'),

我建议您更改数据库列结构,将默认值设置为零并且不允许空值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 2015-01-08
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2014-12-19
    相关资源
    最近更新 更多