YII2 SQL:按li_order_id统计li_units_bought列的求和值
搞定按li_order_id分组统计li_units_bought求和的方法
嘿,我来帮你把这个分组求和的逻辑加到你的Yii查询里!其实很简单,只需要两步:添加求和计算、指定分组字段,具体操作如下:
1. 在SELECT中加入求和字段
首先,在你现有的select列表里,新增一个用SUM()函数计算li_units_bought总和的字段,给它起个清晰的别名,比如TotalUnitsBought,方便后续调用。
2. 添加分组规则
调用Query对象的groupBy()方法,传入li_order_id,让查询按照这个字段对数据进行分组聚合。
修改后的完整代码示例
$query = (new \yii\db\Query()) ->select([ 'oid', 'ord_tracking_no as `Tracking No`', 'site_name as Region', 'adv_name as Advertiser', 'line_id as LineId', 'li_name as LineName', 'li_status as StatusCode', 'prd_desc as Product', 'li_version as Version', 'date_format(lrh_updated_date,"%Y-%m-%d %H:%i") as `Submit Date`', 'date_format(li_start_date,"%Y-%m-%d %H:%i") as `Start Date`', // 新增:统计每个li_order_id下的li_units_bought总和 'SUM(li_units_bought) as TotalUnitsBought', // 你原来的其他date_format字段继续放在这里就行 ]) // 保留你原来的关联表逻辑,比如->join()、->where()这些都不用改 // ->join(...) // ->where(...) // 新增:按li_order_id分组 ->groupBy('li_order_id');
关键注意事项
- 如果你用的MySQL开启了
ONLY_FULL_GROUP_BY(这是默认配置),那SELECT里所有非聚合的字段必须出现在GROUP BY中,或者用聚合函数处理它们。举个例子,如果同一个li_order_id下的site_name都是唯一的,那可以把这些字段都加到groupBy里:->groupBy(['li_order_id', 'oid', 'ord_tracking_no', 'site_name', 'adv_name', ...]) - 如果某些字段在同一个li_order_id下有多个不同值,你得根据业务需求选合适的聚合方式,比如用
MAX(li_name)取最大值,或者ANY_VALUE(prd_desc)取任意值。
内容的提问来源于stack exchange,提问作者Red Bottle
相关产品推荐
相关产品推荐

