Example 2. GROUP BY Aggregation: SUM, AVG, MIN, MAX, COUNT

Example 2. GROUP BY Aggregation: SUM, AVG, MIN, MAX, COUNT

2024-11-24 وقت القراءه : 3 دقائق

عند التعامل مع قواعد البيانات، غالبًا ما نحتاج إلى تجميع البيانات بناءً على معايير معينة وتطبيق دوال تجميعية مختلفة.

في هذا المقال سوف نستخدم دوال التجميع مثل SUM, AVG, MIN, MAX, و COUNT مع GROUP BY لعرض بيانات مجمعة بطريقة مفيدة وفعّالة.

"هذا المثال سيوضح لك كيفية تجميع البيانات بناءً على عمود معين وتجميع البيانات من أعمدة أخرى. على سبيل المثال، نحن بحاجة إلى عرض متوسط إجمالي الطلبات لكل مستخدم:"

لنفترض أننا نرغب في توفير واجهة تمكن المستخدمين من استعراض إحصائيات مختلفة لطلبات المستخدمين، مثل مجموع الطلبات، المتوسط، الحد الأدنى والأعلى، بالإضافة إلى عدد الطلبات.

في هذه الحالة، سأقوم بتجميع جميع الخيارات في جملة واحده بإستخدام switch

public function index(Request $request)
{
    $orders = Order::query();


    switch ($request->input('value')) {
        case 'sum':
        default:
            $orders = $orders->select('user_id', DB::raw('sum(total) as value'));
            break;
        case 'avg':
            $orders = $orders->select('user_id', DB::raw('avg(total) as value'));
            break;
        case 'min':
            $orders = $orders->select('user_id', DB::raw('min(total) as value'));
            break;
        case 'max':
            $orders = $orders->select('user_id', DB::raw('max(total) as value'));
            break;
        case 'count':
            $orders = $orders->select('user_id', DB::raw('count(total) as value'));
            break;
    }


    $orders = $orders->with('user:name,id')
        ->groupBy('user_id')
        ->get();


    return view('groub_by', compact('orders'));
}


كما نرى، أنه يوجد مجموعة من الدول التي نستطيع إستخدامها لإظهار أنواع مختلفة من البيانات:

  • sum() : إظهار مجموع الطلبات لكل مستخدم.
  • avg() : إظهار معدل الطلبات لكل مستخدم.
  • min() : إظهار أقل طلب لكل مستخدم.
  • max() : إظهار أكثر طلب لكل مستخدم.
  • count : إظهار عدد الطلبات لكل مستخدم.


ولإظهار البيانات في ملف blade

<div class="card">
        <div class="card-header">
            <div class="row">
                <div class="col-2"><a href="{{ route('group-by-aggregate', ['value' => 'sum']) }}" class="btn btn-primary">Sum Order Totals</a></div>
                <div class="col-2"><a href="{{ route('group-by-aggregate', ['value' => 'avg']) }}" class="btn btn-success">Average Order value</a></div>
                <div class="col-2"><a href="{{ route('group-by-aggregate', ['value' => 'count']) }}" class="btn btn-danger">Order By User</a></div>
                <div class="col-2"><a href="{{ route('group-by-aggregate', ['value' => 'min']) }}" class="btn btn-info">Min Order</a></div>
                <div class="col-2"><a href="{{ route('group-by-aggregate', ['value' => 'max']) }}" class="btn btn-secondary">Max Order</a></div>
            </div>
        </div>
        <div class="card-body">
            <table class="table table-striped table-bordered">
                <thead>
                <th>Name</th>
                <th>Value</th>
                </thead>
                <tbody>
                @foreach($orders as $order)
                    <tr>
                        <td>{{ $order->user->name }}</td>
                        <td>{{ $order->value }}</td>
                    </tr>
                @endforeach
                </tbody>
            </table>
        </div>
    </div>



إضافة تعليق
Loading...