laravel 将日期范围选择到不同的列中

tuwxkamq  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(147)

| 姓名|日期|得分|
| - ------|- ------|- ------|
| A类|2023年1月1日|一百|
| A类|2023年1月1日|二百|
| A类|二○二三年一月三日|三百|
| 乙|2023年1月2日|四百|
| 乙|二○二三年一月三日|一百|
| 乙|二○二三年一月三日|一百|
我有这个表,我想把它分成多个日期列,并使用查询生成器laravel或原始SQL对该日期的分数求和,所以它变成这样:
| 姓名|第一天|第二天|第三天|
| - ------|- ------|- ------|- ------|
| A类|三百|无|三百|
| 乙|无|四百|二百|
所有这些都是截止到当前月份,即1月31日,以此类推

5f0d552i

5f0d552i1#

您可以使用Laravel查询生成器完成此操作。

$results = DB::table('my_table')
    ->select('Name', DB::raw("SUM(CASE WHEN Date = '2023-01-01' THEN Score ELSE 0 END) AS Day_1"), 
                     DB::raw("SUM(CASE WHEN Date = '2023-01-02' THEN Score ELSE 0 END) AS Day_2"), 
                     DB::raw("SUM(CASE WHEN Date = '2023-01-03' THEN Score ELSE 0 END) AS Day_3"))
    ->groupBy('Name')
    ->get();
pvcm50d1

pvcm50d12#

你没有提供任何类似于你尝试的查询,你是如何传递日期(它是一个范围,只有月份等),和你想要的json输出。
甚至很难设想您将如何执行操作,特别是您将在所需结果中传递列值作为列名(这对于原始SQL查询没有多大意义,除非这些列不是动态的)。
但为了给您一个起点,您可以简单地按名称、日期对它们进行分组,然后再按集合中的日期进行另一次分组
即:

$result = DB::table('table_name')->select([
    'name',
    'date',
])
->selectRaw('sum(score) AS score')
->groupBy(['name', 'date'])->get();

return $result->groupBy('date');

那么你应该能够得到如下格式的结果;

{
    "01-01-2023" : [
        {
            "name": "A",
            "date": "01-01-2023",
            "score": "300"
        }
    ],
    "02-01-2023" : [
        {
            "name": "A",
            "date": "02-01-2023",
            "score": "300"
        }
        {
            "name": "B",
            "date": "02-01-2023",
            "score": "200"
        }
    ],
    "03-01-2023" : [
        .
        .
        .
    ]
}

对于您想要的表结果,最好将其更改为动态行而不是动态列

    • 编辑**

参考KarlAnswer,您可以循环遍历一个日期范围并注入额外的select语句。
即当月日期

$dateRange = \Carbon\CarbonPeriod::create(now()->startOfMonth(), now()->endOfMonth() )->toArray();

$result = DB::table('table_name')->select(['name']);

foreach ($dateRange as $date) {
    $dateFormat = $date->format('d-m-Y');
    $day = $date->format('j');
    $result->selectRaw("SUM(CASE WHEN Date = '$dateFormat' THEN Score ELSE 0 END) AS 'Day $day'");
}

return $result->groupBy('name')->get();

相关问题