Changes between Initial Version and Version 1 of VenueCapacity


Ignore:
Timestamp:
05/13/26 21:21:47 (13 days ago)
Author:
193284
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • VenueCapacity

    v1 v1  
     1= Venue Capacity Utilization Analysis =
     2
     3== 2. Scenario Overview ==
     4
     5This scenario analyzes venue occupancy and attendance utilization for weddings organized inside the system.
     6
     7The analysis combines:
     8* venue capacity information
     9* wedding bookings
     10* guest attendance records
     11* event participation statistics
     12
     13The generated report provides operational insights regarding:
     14* occupancy percentage
     15* attendance efficiency
     16* available seating capacity
     17* utilization classification
     18
     19== 2.1 Objective ==
     20
     21Analyze the relationship between confirmed guest attendance and venue capacity constraints.
     22
     23The report determines:
     24* actual occupancy rate
     25* available seating capacity
     26* venue utilization level
     27* attendance efficiency
     28
     29This analysis combines attendance records, venue specifications, and booking confirmations to establish operational efficiency indicators.
     30
     31== 2.2 SQL Query Implementation ==
     32
     33=== SQL Code ===
     34
     35{{{
     36#!sql
     37SELECT
     38    v.venue_id,
     39    v.name AS venue_name,
     40    v.capacity AS venue_capacity,
     41
     42    w.wedding_id,
     43
     44    u.first_name || ' ' || u.last_name
     45        AS organizer_name,
     46
     47    w.date AS wedding_date,
     48
     49    COUNT(DISTINCT a.guest_id)
     50        AS confirmed_attendees,
     51
     52    COUNT(
     53        DISTINCT CASE
     54            WHEN a.status = 'ATTENDED'
     55            THEN a.guest_id
     56        END
     57    ) AS actual_attendance,
     58
     59    v.capacity - COUNT(DISTINCT a.guest_id)
     60        AS available_seats,
     61
     62    ROUND(
     63        (
     64            CAST(COUNT(DISTINCT a.guest_id) AS NUMERIC)
     65            / v.capacity
     66        ) * 100,
     67        2
     68    ) AS occupancy_rate_percent,
     69
     70    CASE
     71        WHEN COUNT(DISTINCT a.guest_id) > v.capacity
     72            THEN 'EXCEEDED'
     73
     74        WHEN COUNT(DISTINCT a.guest_id)
     75            >= (v.capacity * 0.9)
     76            THEN 'HIGH'
     77
     78        WHEN COUNT(DISTINCT a.guest_id)
     79            >= (v.capacity * 0.6)
     80            THEN 'MODERATE'
     81
     82        ELSE 'LOW'
     83    END AS utilization_category,
     84
     85    vb.status AS booking_status,
     86    vb.date AS booking_date
     87
     88FROM venue v
     89
     90INNER JOIN venue_booking vb
     91    ON v.venue_id = vb.venue_id
     92
     93INNER JOIN wedding w
     94    ON vb.wedding_id = w.wedding_id
     95
     96INNER JOIN "user" u
     97    ON w.user_id = u.user_id
     98
     99LEFT JOIN event e
     100    ON w.wedding_id = e.wedding_id
     101
     102LEFT JOIN attendance a
     103    ON e.event_id = a.event_id
     104    AND a.status IN ('ATTENDED', 'CONFIRMED')
     105
     106GROUP BY
     107    v.venue_id,
     108    v.name,
     109    v.capacity,
     110    w.wedding_id,
     111    u.first_name,
     112    u.last_name,
     113    w.date,
     114    vb.status,
     115    vb.date
     116
     117HAVING COUNT(DISTINCT a.guest_id) > 0
     118
     119ORDER BY
     120    v.venue_id,
     121    w.wedding_id;
     122}}}
     123
     124== 2.3 Query Complexity Analysis ==
     125
     126* Join Count:
     127  * 6 tables
     128
     129* Join Types:
     130  * INNER JOIN
     131  * LEFT JOIN
     132
     133* Aggregate Functions:
     134  * COUNT(DISTINCT ...)
     135  * ROUND()
     136  * CASE
     137
     138* Filtering Logic:
     139  * HAVING clause after aggregation
     140
     141* Conditional Categorization:
     142  * LOW
     143  * MODERATE
     144  * HIGH
     145  * EXCEEDED
     146
     147== 2.4 Relational Algebra Expression ==
     148
     149{{{
     150π(
     151    v.venue_id,
     152    v.name,
     153    v.capacity,
     154    w.wedding_id,
     155    u.fname,
     156    u.lname,
     157    w.date,
     158    COUNT(a.guest_id),
     159    v.capacity - COUNT(a.guest_id),
     160    (COUNT(a.guest_id) / v.capacity) * 100
     161)
     162
     163(
     164    σ(COUNT(guest_id) > 0)
     165
     166    (
     167        γ(
     168            venue_id,
     169            wedding_id,
     170            COUNT(DISTINCT a.guest_id)
     171        )
     172
     173        (
     174            (((Venue ⟕ Venue_Booking)
     175            ⟕ Wedding)
     176            ⟕ User)
     177            ⟕ Event)
     178            ⟕ Attendance
     179        )
     180)
     181}}}
     182
     183=== Notation ===
     184
     185* π = Projection
     186* σ = Selection
     187* γ = Grouping and aggregation
     188* ⟕ = Join operation
     189* COUNT(DISTINCT ...) = Distinct aggregation
     190
     191=== Interpretation ===
     192
     193The expression combines venue, booking, wedding, event, and attendance relations in order to calculate venue occupancy metrics.
     194
     195Aggregation is applied after filtering attendance data, enabling utilization analysis for each wedding event.
     196
     197== 2.5 PostgreSQL Stored Procedure ==
     198
     199=== SQL Code ===
     200
     201{{{
     202#!sql
     203CREATE OR REPLACE PROCEDURE
     204venue_capacity_utilization_report(
     205
     206    IN p_venue_id INT DEFAULT NULL,
     207
     208    IN p_min_occupancy_percent NUMERIC DEFAULT 0,
     209
     210    IN p_max_occupancy_percent NUMERIC DEFAULT 100
     211)
     212
     213LANGUAGE plpgsql
     214
     215AS $$
     216
     217DECLARE
     218
     219    v_record RECORD;
     220
     221    v_confirmed_count INTEGER;
     222
     223    v_actual_count INTEGER;
     224
     225    v_occupancy_rate NUMERIC;
     226
     227    v_utilization_category VARCHAR;
     228
     229    v_capacity INTEGER;
     230
     231BEGIN
     232
     233    CREATE TEMP TABLE capacity_utilization_results (
     234
     235        venue_id INTEGER,
     236
     237        venue_name VARCHAR,
     238
     239        venue_capacity INTEGER,
     240
     241        wedding_id INTEGER,
     242
     243        organizer_name VARCHAR,
     244
     245        wedding_date DATE,
     246
     247        confirmed_attendees INTEGER,
     248
     249        actual_attendance INTEGER,
     250
     251        available_seats INTEGER,
     252
     253        occupancy_rate_percent NUMERIC,
     254
     255        utilization_category VARCHAR,
     256
     257        booking_status VARCHAR,
     258
     259        booking_date DATE
     260    );
     261
     262    FOR v_record IN
     263
     264        SELECT DISTINCT
     265            v.venue_id,
     266            v.name,
     267            v.capacity,
     268            w.wedding_id,
     269            u.first_name,
     270            u.last_name,
     271            w.date,
     272            vb.status,
     273            vb.date
     274
     275        FROM venue v
     276
     277        INNER JOIN venue_booking vb
     278            ON v.venue_id = vb.venue_id
     279
     280        INNER JOIN wedding w
     281            ON vb.wedding_id = w.wedding_id
     282
     283        INNER JOIN "user" u
     284            ON w.user_id = u.user_id
     285
     286        WHERE
     287            (
     288                p_venue_id IS NULL
     289                OR v.venue_id = p_venue_id
     290            )
     291
     292    LOOP
     293
     294        SELECT COUNT(DISTINCT a.guest_id)
     295
     296        INTO v_confirmed_count
     297
     298        FROM event e
     299
     300        LEFT JOIN attendance a
     301            ON e.event_id = a.event_id
     302            AND a.status = 'CONFIRMED'
     303
     304        WHERE e.wedding_id = v_record.wedding_id;
     305
     306        SELECT COUNT(DISTINCT a.guest_id)
     307
     308        INTO v_actual_count
     309
     310        FROM event e
     311
     312        LEFT JOIN attendance a
     313            ON e.event_id = a.event_id
     314            AND a.status = 'ATTENDED'
     315
     316        WHERE e.wedding_id = v_record.wedding_id;
     317
     318        v_confirmed_count :=
     319            COALESCE(v_confirmed_count, 0);
     320
     321        v_actual_count :=
     322            COALESCE(v_actual_count, 0);
     323
     324        v_capacity := v_record.capacity;
     325
     326        IF v_capacity > 0 THEN
     327
     328            v_occupancy_rate :=
     329                ROUND(
     330                    (
     331                        CAST(v_confirmed_count AS NUMERIC)
     332                        / v_capacity
     333                    ) * 100,
     334                    2
     335                );
     336
     337        ELSE
     338
     339            v_occupancy_rate := 0;
     340
     341        END IF;
     342
     343        IF v_confirmed_count > v_capacity THEN
     344
     345            v_utilization_category := 'EXCEEDED';
     346
     347        ELSIF v_occupancy_rate >= 90 THEN
     348
     349            v_utilization_category := 'HIGH';
     350
     351        ELSIF v_occupancy_rate >= 60 THEN
     352
     353            v_utilization_category := 'MODERATE';
     354
     355        ELSE
     356
     357            v_utilization_category := 'LOW';
     358
     359        END IF;
     360
     361        IF v_occupancy_rate BETWEEN
     362            p_min_occupancy_percent
     363            AND
     364            p_max_occupancy_percent
     365
     366        THEN
     367
     368            INSERT INTO capacity_utilization_results
     369
     370            VALUES (
     371
     372                v_record.venue_id,
     373
     374                v_record.name,
     375
     376                v_record.capacity,
     377
     378                v_record.wedding_id,
     379
     380                v_record.first_name || ' ' ||
     381                v_record.last_name,
     382
     383                v_record.date,
     384
     385                v_confirmed_count,
     386
     387                v_actual_count,
     388
     389                v_capacity - v_confirmed_count,
     390
     391                v_occupancy_rate,
     392
     393                v_utilization_category,
     394
     395                v_record.status,
     396
     397                v_record.date
     398            );
     399
     400        END IF;
     401
     402    END LOOP;
     403
     404    RAISE NOTICE
     405        'Venue Capacity Utilization Report Generated - % rows processed',
     406
     407        (
     408            SELECT COUNT(*)
     409            FROM capacity_utilization_results
     410        );
     411
     412END;
     413$$;
     414}}}
     415
     416== 2.6 Procedure Characteristics ==
     417
     418* Input Parameters:
     419  * venue ID
     420  * minimum occupancy percentage
     421  * maximum occupancy percentage
     422
     423* Attendance Analysis:
     424  * confirmed attendance counting
     425  * actual attendance counting
     426
     427* Occupancy Classification:
     428  * LOW
     429  * MODERATE
     430  * HIGH
     431  * EXCEEDED
     432
     433* NULL Handling:
     434  * COALESCE() usage
     435
     436* Filtering Logic:
     437  * occupancy percentage range filtering
     438
     439== 2.7 Proof of Execution with Sample Data ==
     440
     441=== Sample Data Insertion ===
     442
     443{{{
     444#!sql
     445INSERT INTO "user" (
     446    first_name,
     447    last_name,
     448    email,
     449    phone_number
     450)
     451VALUES (
     452    'Марко',
     453    'Стојановски',
     454    'marko.s@email.com',
     455    '070-123-456'
     456);
     457
     458INSERT INTO wedding (
     459    date,
     460    budget,
     461    user_id
     462)
     463VALUES (
     464    '2024-07-20',
     465    12000.00,
     466    2
     467);
     468
     469INSERT INTO venue (
     470    name,
     471    location,
     472    city,
     473    address,
     474    capacity,
     475    price_per_guest,
     476    type_id
     477)
     478VALUES (
     479    'Golden Palace',
     480    'Centar',
     481    'Skopje',
     482    'Ilindenska 15',
     483    150,
     484    55.00,
     485    1
     486);
     487}}}
     488
     489=== Query Execution Result ===
     490
     491{{{
     492 venue_id | venue_name    | venue_capacity
     493----------+---------------+----------------
     494 2        | Golden Palace | 150
     495}}}
     496
     497=== Calculation Verification ===
     498
     499* Confirmed Attendees:
     500  * guests marked as CONFIRMED
     501
     502* Actual Attendance:
     503  * guests marked as ATTENDED
     504
     505* Available Seats:
     506  * venue capacity minus confirmed attendees
     507
     508* Occupancy Rate:
     509  * percentage of occupied seats
     510
     511* Utilization Category:
     512  * calculated based on occupancy thresholds
     513
     514== Summary ==
     515
     516This scenario demonstrates operational venue analysis using:
     517* multi-table joins
     518* attendance aggregation
     519* occupancy calculations
     520* utilization categorization
     521* PostgreSQL stored procedures
     522* analytical reporting techniques