有2个表bills and 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
}
]
答案 0 :(得分:4)
问题来自您的JOIN
条件:
DB::table('bills')
->Join(
'payments',
DB::raw('DATE(payments.created_at)'),
'=',
DB::raw('DATE(bills.created_at)')
)
您要删除日期的时间部分,然后再进行合并:因此,您最终会为每个payments
得到几个匹配的bill
。
从您的示例数据中,我看起来像payments.bill_id
列是为了加入:
DB::table('bills')
->Join(
'payments',
DB::raw('payments.bill_id'),
'=',
DB::raw('bills.id')
)