【问题标题】:Laravel get last record of each month of column A with SUM column B value in MySQLLaravel在MySQL中使用SUM B列值获取A列每个月的最后一条记录
【发布时间】:2020-09-12 05:37:22
【问题描述】:

我尝试使用 Laravel 5.4 在 MySql db 中获取列 value 的每个月的最后一条记录和列 volume 的 SUM 值,我的数据库结构如下:

id | volume | value | date
---+--------+-------+-----------
 1 | 5      |   2   | 2020-01-01
 2 | 1      |   3   | 2020-01-22
 3 | 1      |   3   | 2020-02-02
 4 | 3      |   1   | 2020-02-03
 5 | 2      |   4   | 2020-09-03

所以我需要的是 输出:

SUM(volume) | value | date
------------+-------+------------
    6       |   3   | 2020-01-22
    4       |   1   | 2020-02-03
    2       |   4   | 2020-09-03

我做了什么:

$data = DomesticMarket::select(DB::raw('SUM(volume) AS "volume", CONCAT(YEAR(`date`), "-", MONTH(`date`)) AS mydate, value AS "value", YEAR(`date`) AS gy, MONTH(`date`) AS gm'))
        ->whereBetween('date', [$start, $end])
        ->where('active', '1')
        ->groupBy('gy')
        ->groupBy('gm')
        ->groupBy('mydate')
        ->groupBy('value')
        ->orderBy('gy')
        ->orderBy('gm')
        ->get();

请给我最好的方法来检索这样的结果。提前谢谢..

【问题讨论】:

    标签: mysql laravel


    【解决方案1】:

    我在 SQL Server 上测试了以下内容 - 我相信它可以在 mySQL 上运行 - 我不熟悉 Laravel,但是您可以根据自己的需要调整此查询。它的关键是使用 Window 函数 (ROW_NUMBER() OVER (PARTITION BY...))。这使您可以按照日期值的顺序对嵌套查询中每个月的行进行排名(如果您有多个特定日期的记录会发生什么情况??)。

    SELECT SUM(volume) [volume], MAX(CASE WHEN [row]=1 THEN value ELSE 0 END) [value], 
    MAX(CASE WHEN [row]=1 THEN dt ELSE NULL END) [date]
    FROM (
        SELECT volume, value, dt,  ROW_NUMBER() OVER(PARTITION BY YEAR(dt), MONTH(dt) ORDER BY dt DESC) row
        FROM TestValues
    ) src
    GROUP BY YEAR(dt), MONTH(dt)
    ORDER BY [date]
    

    PARTITION BY 使用“YEAR()”和“MONTH()”将您的记录分成几组。 ORDER BY 确保记录在每个组中从最后到第一个(按 [日期])排列。外部查询使用该排名 ([row]=1) 来获取每个月的“Last”记录的 [value] 和 [date] 值。所以 [row]=1 是每个月 [date] 的最后一条记录。

    【讨论】:

      猜你喜欢
      • 2017-02-19
      • 1970-01-01
      • 2011-12-17
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多