有 2 个表 bills 和 payments
,总销售额插入到订单表中,收入插入到付款表中。我想显示过去 7 天的总销售额和总现金收款,但我的查询给我的结果乘以 laravel 中同一日期数据的次数。
我想获取 bills.created_date=payments.created_date
过去 7 天中每一天的总金额。我的查询运行良好,但它给出了总和乘以特定日期的条目。
我的查询(Laravel):
public function salesAndRevenue(){
$date = new Carbon\Carbon;
$salesAndRevenue =
DB::table('bills')
->Join(
'payments',
DB::raw('DATE(payments.created_at)'),
'=',
DB::raw('DATE(bills.created_at)'))
->select(
DB::raw('DATE(payments.created_at) as date'),
DB::raw('sum(payments.amount) as total_revenue'),
DB::raw('sum(bills.total_amount) as total_sales'))
->groupBy(DB::raw('DATE(payments.created_at)'))
->where(
DB::raw('DATE(bills.created_at)'),
'>',
$date->subDays(7)->toDateTimeString())
->get()->toArray();
return $salesAndRevenue;
}
我的预期结果:
array:2 [▼
0 => {#254 ▼
+"date": "2019-03-11"
+"total_revenue": 5.0
+"total_sales": 5.0
}
1 => {#255 ▼
+"date": "2019-03-12"
+"total_revenue": 1500.0
+"total_sales": 1500.0
}
]
我的输出:
array:2 [▼
0 => {#254 ▼
+"date": "2019-03-11"
+"total_revenue": 5.0
+"total_sales": 5.0
}
1 => {#255 ▼
+"date": "2019-03-12"
+"total_revenue": 4500.0
+"total_sales": 4500.0
}
]
但是这段代码在不使用 join 从单个表中获取数据的情况下工作得很好。 喜欢:
$sales =
DB::table('bills')
->select(
DB::raw('DATE(created_at) as date'),
DB::raw('sum(total_amount) as total_sales'))
->groupBy('date')
->where(
DB::raw('DATE(created_at)'),
'>',
$date->subDays(7)->toDateTimeString())
->get()->toArray();
输出:
array:2 [▼
0 => {#259 ▼
+"date": "2019-03-11"
+"total_sales": 5.0
}
1 => {#260 ▼
+"date": "2019-03-12"
+"total_sales": 1500.0
}
]
最佳答案
问题出在你的JOIN
条件:
DB::table('bills')
->Join(
'payments',
DB::raw('DATE(payments.created_at)'),
'=',
DB::raw('DATE(bills.created_at)')
)
您正在删除日期的时间部分,然后加入:因此您最终会为每个 bill
获得多个匹配的 payments
。
根据您的示例数据,在我看来列 payments.bill_id
是为了加入:
DB::table('bills')
->Join(
'payments',
DB::raw('payments.bill_id'),
'=',
DB::raw('bills.id')
)
关于php - 带有 join 的 Sum 函数给出总和乘以 laravel ORM 中条目的次数与 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55130550/