php – 如何使sql查询按日期对结果进行分组和求和?

在yii2应用程序中,我有付款模型,字段ID(主键),u_id(整数,表示从用户模型进行此付款的人的ID),总和(整数)和日期.例:

+--------------------------------+
| Payment                        |
+--------------------------------+
| id | u_id | sum  | date        |
+--------------------------------+
| 1  | 1    | 400  | 2015-11-25  |
| 2  | 1    | 200  | 2015-11-25  |
| 3  | 2    | 500  | 2015-11-25  |
| 4  | 2    | 300  | 2015-11-25  |
| 5  | 1    | 100  | 2015-11-20  |
+--------------------------------+

问:我想按日期对结果进行分组,并为每天的每个u_id汇总所有行的总和字段,并显示总行数.怎么做…?也许没有总排?在yii2或干净的MysqL.结果示例:

+-------------------------------------+
| Date       | User id | Money, $    |
+-------------------------------------+
| 2015-11-25 |         | 1400 (total) |
| 2015-11-25 | 1       | 600          |
| 2015-11-25 | 2       | 800          |
| 2015-11-20 |         | 100 (total)  |
| 2015-11-20 | 1       | 100          |
+-------------------------------------+

付款方式:

public function search($params)
{
    $query = Payment::find();

    // do we need to group and sum here?

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    $this->load($params);

    return $dataProvider;
}

我想ListView会比GridView更容易,因为我们将能够为每个结果进行一些计算.视图:

<table>
    <thead>
        <tr>
            <th>Date</th>
            <th>User id</th>
            <th>Money, $</th>
        </tr>
    </thead>
    <tbody>
        <?= ListView::widget([
            'dataProvider' => $dataProvider,
            'itemView' => '_item_view',
        ]) ?>
    </tbody>
</table>

_item_view:

<tr>
    <td><?= $model->date ?></td>
    <td><?= $model->u_id ?></td>
    <td><?= $model->sum ?></td>
</tr>

解决方法:

试试这种方式:

select dt "Date", usr "User Id", 
      case when usr is null 
           then concat(money, ' (total)')
           else money
           end as "Money, $"
  from (
     select dt, null as usr, sum(vsum) as money
       from mytable
      group by dt
     union
     select dt, u_id, sum(vsum) as money
       from mytable
      group by dt, u_id
   ) a
  order by dt desc, coalesce(usr,0)

在这里看到:
http://sqlfiddle.com/#!9/48102/6

你可以在普通的MysqL中使用分析函数,但由于MysqL不支持它,你必须模拟它.

在我的解决方案中,我提出了一个只按日期汇总钱的查询

select dt, null as usr, sum(vsum) as money
  from mytable
 group by dt

需要null作为usr列,因此我可以将UNION运算符与第二部分一起使用.此查询将汇总所有日期和金额.

然后是第二部分

select dt, u_id, sum(vsum) as money
  from mytable
 group by dt, u_id

Wich将通过用户总结钱来获取所有日期.

第三部分是使它成为子查询,所以我可以按日期,用户订购它.请记住,第一部分的用户是null,所以我这样做,所以每当null变为0,所以它将首先显示.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...