Changes between Initial Version and Version 1 of ProcedureV1


Ignore:
Timestamp:
08/15/25 20:14:44 (4 days ago)
Author:
221071
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • ProcedureV1

    v1 v1  
     1= Domify
     2
     3== Напредни извештаи од базата (SQL и складирани процедури)
     4
     5
     6=== 1. Извештај за вкупни приходи на изнајмувачите на недвижности за нивните изнајмени единици како и просечен приход остварен по изнајмена единица во тековната година.
     7{{{
     8SELECT
     9    u.first_name,
     10    u.last_name,
     11    u.email,
     12    u.rating,
     13    lp.is_agent,
     14    COUNT(DISTINCT l.id) AS lease_count,
     15    COUNT(DISTINCT l.tenant_id) AS tenant_count,
     16    COALESCE(SUM(p.amount), 0) AS total_revenue,
     17    ROUND(
     18        CASE WHEN COUNT(DISTINCT l.id) > 0
     19             THEN COALESCE(SUM(p.amount), 0) / COUNT(DISTINCT l.id)
     20             ELSE 0
     21        END, 2
     22    ) AS avg_revenue_per_lease
     23FROM LandlordProfile lp
     24JOIN UserD u ON u.id = lp.id
     25JOIN Lease l ON lp.id = l.landlord_id
     26LEFT JOIN Payment p
     27    ON p.lease_id = l.id
     28    AND p.payment_date >= date_trunc('year', CURRENT_DATE)
     29GROUP BY u.id, u.first_name, u.last_name, u.email, u.rating, lp.is_agent
     30ORDER BY total_revenue DESC;
     31}}}
     32
     33
     34=== 2. Извештај за перформансите на недвижностите по градови: број на имоти, број на издавачки единици, активни единици, остварени приходи за тековната година по град како и просечна кирија по изнајмувачка единица како и остварен приход по објект.
     35
     36{{{
     37SELECT
     38    a.city,
     39    COUNT(DISTINCT p.id) as total_properties,
     40    COUNT(DISTINCT u.id) as total_units,
     41    COUNT(DISTINCT l.id) as active_leases,
     42    SUM(pay.amount) as total_revenue,
     43    ROUND(AVG(l.rent_amount),2) as avg_rent_per_lease,
     44    ROUND (SUM(pay.amount) / COUNT(DISTINCT p.id),2) as revenue_per_property
     45FROM Address a
     46JOIN Property p ON a.id = p.address_id
     47JOIN Unit u ON p.id = u.property_id
     48JOIN Listing lst ON u.id = lst.unit_id
     49JOIN Lease l ON lst.id = l.listing_id
     50JOIN Payment pay ON l.id = pay.lease_id
     51WHERE EXTRACT(YEAR FROM pay.payment_date) = EXTRACT(YEAR FROM CURRENT_DATE)
     52    AND pay.status = 'завршено'
     53GROUP BY a.city
     54ORDER BY total_revenue DESC;
     55}}}
     56
     57=== 3. Извештај за процент на изнајмени недвижности во однос на објавени огласи за секоја година.
     58{{{
     59WITH total_listings AS (
     60    SELECT
     61        EXTRACT(YEAR FROM available_from) AS year,
     62        COUNT(*) AS listing_count
     63    FROM Listing
     64    GROUP BY year
     65),
     66converted_listings AS (
     67    SELECT
     68        EXTRACT(YEAR FROM l.start_date) AS year,
     69        COUNT(DISTINCT li.id) AS converted
     70    FROM Lease l
     71    JOIN Listing li ON l.listing_id = li.id
     72    GROUP BY year
     73)
     74SELECT
     75    tl.year,
     76    tl.listing_count,
     77    COALESCE(cl.converted, 0) AS converted,
     78    ROUND(100.0 * COALESCE(cl.converted, 0) / tl.listing_count, 2) AS conversion_rate
     79FROM total_listings tl
     80LEFT JOIN converted_listings cl ON tl.year = cl.year
     81ORDER BY tl.year;
     82}}}
     83
     84
     85=== 4. Извештај за раст на приходи (извршени успешни плаќања за изнајмувања) за претходна и тековна година  за секој град изразена во проценти.
     86{{{
     87
     88WITH yearly_income AS (
     89    SELECT
     90        a.city,
     91        EXTRACT(YEAR FROM p.payment_date) AS year,
     92        SUM(p.amount) AS total_revenue
     93    FROM Payment p
     94    JOIN Lease l ON l.id = p.lease_id
     95    JOIN Listing li ON li.id = l.listing_id
     96    JOIN Unit u ON li.unit_id = u.id
     97    JOIN Property pr ON u.property_id = pr.id
     98    JOIN Address a ON pr.address_id = a.id
     99    WHERE p.status = 'завршено'
     100    GROUP BY a.city, year
     101),
     102diffs AS (
     103    SELECT
     104        curr.city,
     105        curr.total_revenue AS this_year,
     106        prev.total_revenue AS last_year,
     107        ROUND(((curr.total_revenue - prev.total_revenue) / NULLIF(prev.total_revenue, 0)) * 100, 2) AS growth_percent
     108    FROM yearly_income curr
     109    JOIN yearly_income prev ON prev.city = curr.city AND curr.year = prev.year + 1
     110    WHERE curr.year = EXTRACT(YEAR FROM CURRENT_DATE)
     111)
     112SELECT *
     113FROM diffs
     114ORDER BY growth_percent DESC;
     115
     116}}}
     117
     118=== 5. Извештај за цени за изнајмување на недвижности (просечна, минимална, максимална и цена по метар квадратен) согласно категорија на објект, град, број на соби, големина на објект.
     119{{{
     120
     121SELECT
     122    pt.name AS property_type,
     123    a.city,
     124    u.bedrooms,
     125    CASE
     126        WHEN u.area_sq_m < 50 THEN 'Мала (<50м²)'
     127        WHEN u.area_sq_m < 80 THEN 'Средна (50-80м²)'
     128        ELSE 'Голема (>80м²)'
     129    END AS size_category,
     130    COUNT(l.id) AS lease_count,
     131    ROUND(AVG(l.rent_amount), 2) AS avg_rent,
     132    ROUND(MIN(l.rent_amount), 2) AS min_rent,
     133    ROUND(MAX(l.rent_amount), 2) AS max_rent,
     134    ROUND(AVG(l.rent_amount / u.area_sq_m), 2) AS price_per_sqm
     135FROM Lease l
     136JOIN Listing li ON l.listing_id = li.id
     137JOIN Unit u ON li.unit_id = u.id
     138JOIN Property p ON u.property_id = p.id
     139JOIN PropertyType pt ON p.property_type_id = pt.id
     140JOIN Address a ON p.address_id = a.id
     141WHERE l.start_date >= CURRENT_DATE - INTERVAL '12 months'
     142GROUP BY pt.name, a.city, u.bedrooms, size_category
     143HAVING COUNT(l.id) >= 1
     144ORDER BY a.city, pt.name, u.bedrooms;
     145}}}
     146
     147=== 6. Извештај за последната година за тоа колку просечно денови во секој месец огласите биле изложени пред да биде склучен договор за нив.
     148{{{
     149SELECT
     150    EXTRACT(YEAR FROM li.available_from) AS year,
     151    EXTRACT(MONTH FROM li.available_from) AS month,
     152    COUNT(*) AS total_listings,
     153    AVG(l.start_date - li.available_from) AS avg_days_on_market
     154FROM Listing li
     155JOIN Lease l ON li.id = l.listing_id
     156WHERE li.available_from >= CURRENT_DATE - INTERVAL '365 days' AND l.start_date BETWEEN li.available_from AND li.available_to
     157GROUP BY year, month
     158ORDER BY year, month;
     159}}}
     160
     161=== 7. Извештај за број на барања за поправка/сервисирање на недвижност по град
     162{{{
     163SELECT
     164  a.city,
     165  COUNT(sr.id) AS request_count
     166FROM ServiceRequest sr
     167JOIN Lease l ON sr.lease_id = l.id
     168JOIN Listing li ON l.listing_id = li.id
     169JOIN Unit u ON li.unit_id = u.id
     170JOIN Property p ON u.property_id = p.id
     171JOIN Address a ON p.address_id = a.id
     172WHERE EXTRACT(YEAR FROM sr.request_date) = EXTRACT(YEAR FROM CURRENT_DATE)
     173GROUP BY a.city
     174ORDER BY request_count DESC
     175}}}
     176
     177=== 8. Извештај за заинтересираност на изнајмувачи, издавачи со најмногу заинтересирани огласи сортирани по популарност
     178
     179{{{
     180SELECT
     181    u.first_name,
     182    u.last_name,
     183    u.email,
     184    a.city,
     185    COUNT(DISTINCT li.id) AS total_listings,
     186    COUNT(i.tenant_profile_id) AS total_interested_tenants,
     187        ROUND(COUNT(i.tenant_profile_id) / COUNT(DISTINCT li.id), 2) AS avg_interest_per_listing
     188FROM LandlordProfile lp
     189JOIN UserD u ON lp.id = u.id
     190JOIN Property p ON p.owner_id = u.id
     191JOIN Unit un ON un.property_id = p.id
     192JOIN Listing li ON li.unit_id = un.id
     193JOIN Address a ON p.address_id = a.id
     194LEFT JOIN Interested i ON li.id = i.listing_id
     195WHERE li.available_from >= CURRENT_DATE - INTERVAL '12 months'
     196GROUP BY u.id, u.first_name, u.last_name, u.email, a.city
     197HAVING COUNT(i.tenant_profile_id) > 0
     198ORDER BY total_interested_tenants DESC;
     199}}}