Cakephp在postgres中获取关联和组

Cakephp get associative sum group by in postgres

我有两张桌子

coins       summary_coins 
--------    -------------
id | name    id| date                |  get_count | coin_id
===|====    ==============================================
 1 |lira     1 | 2020-02-16 16:55:50 |  20        | 1
 2 |A        1 | 2020-03-16 16:55:50 |  12        | 1
 3 |B        1 | 2020-03-16 16:55:50 |  20        | 1

我的预期结果

name get_count   previous_month_count  
Lira 32          20

我尝试了以下 cakephp 方法以获得预期结果

    public function getCount($start_date,$end_date,$previous_month_start_date,$previous_month_end_date)
    {
        $query = $this->find();
        $query
            ->select([
                        'Coins.id',
                        'Coins.name',
                        'curr_get_count' => $query->func()->sum('SummaryCoins.get_count'),
                        'prev_get_count' => $query->func()->sum('SummaryCoins.get_count'),
 
            ])
            ->matching('SummaryCoins')
            ->where([
                'SummaryCoins.user_id' => 1,
                'SummaryCoins.date >' => '2021-04-01',
                'SummaryCoins.date <' => '2021-05-31'
            ])
            ->group([
                'Coins.id',
             ]);
        return $query;
   }

我在这里获取当前月份范围,我将如何获取上个月的计数?

有很多方法可以实现这一点,子查询、多个自定义连接、case 表达式等...

我建议您首先尝试 case 表达式,根据您的日期条件,您可以 return SummaryCoins.get_countNULLSUM ) 或 0(如果没有行符合您的条件,您希望总和为 0 而不是 NULL),例如生成 SQL,例如:

SUM(
    CASE WHEN
        SummaryCoins.date >= '2020-03-01' AND
        SummaryCoins.date <= '2020-03-31'
    THEN
        SummaryCoins.get_count
    ELSE
        0
    END
)
$query
    ->select([
        'Coins.id',
        'Coins.name',
        'curr_get_count' => $query->func()->sum(
            $query
                ->newExpr()
                ->addCase(
                    [
                        $query->newExpr()->add([
                            'SummaryCoins.date >=' => $start_date,
                            'SummaryCoins.date <=' => $end_date,
                        ])
                    ],
                    [$query->identifier('SummaryCoins.get_count'), 0]
                    [null, 'integer']
                )
        ),
        'prev_get_count' => $query->func()->sum(
            $query
                ->newExpr()
                ->addCase(
                    [
                        $query->newExpr()->add([
                            'SummaryCoins.date >=' => $previous_month_start_date,
                            'SummaryCoins.date <=' => $previous_month_end_date,
                        ]),
                    ],
                    [$query->identifier('SummaryCoins.get_count'), 0]
                    [null, 'integer']
                )
        ),
    ])

另请注意,您应该使用 >=<= 来使条件包含在内,否则如果时间部分是 00:00:00.

另见