| 1 | = Domify |
| 2 | |
| 3 | == Напредни извештаи од базата (SQL и складирани процедури) |
| 4 | |
| 5 | |
| 6 | === 1. Извештај за вкупни приходи на изнајмувачите на недвижности за нивните изнајмени единици како и просечен приход остварен по изнајмена единица во тековната година. |
| 7 | {{{ |
| 8 | SELECT |
| 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 |
| 23 | FROM LandlordProfile lp |
| 24 | JOIN UserD u ON u.id = lp.id |
| 25 | JOIN Lease l ON lp.id = l.landlord_id |
| 26 | LEFT JOIN Payment p |
| 27 | ON p.lease_id = l.id |
| 28 | AND p.payment_date >= date_trunc('year', CURRENT_DATE) |
| 29 | GROUP BY u.id, u.first_name, u.last_name, u.email, u.rating, lp.is_agent |
| 30 | ORDER BY total_revenue DESC; |
| 31 | }}} |
| 32 | |
| 33 | |
| 34 | === 2. Извештај за перформансите на недвижностите по градови: број на имоти, број на издавачки единици, активни единици, остварени приходи за тековната година по град како и просечна кирија по изнајмувачка единица како и остварен приход по објект. |
| 35 | |
| 36 | {{{ |
| 37 | SELECT |
| 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 |
| 45 | FROM Address a |
| 46 | JOIN Property p ON a.id = p.address_id |
| 47 | JOIN Unit u ON p.id = u.property_id |
| 48 | JOIN Listing lst ON u.id = lst.unit_id |
| 49 | JOIN Lease l ON lst.id = l.listing_id |
| 50 | JOIN Payment pay ON l.id = pay.lease_id |
| 51 | WHERE EXTRACT(YEAR FROM pay.payment_date) = EXTRACT(YEAR FROM CURRENT_DATE) |
| 52 | AND pay.status = 'завршено' |
| 53 | GROUP BY a.city |
| 54 | ORDER BY total_revenue DESC; |
| 55 | }}} |
| 56 | |
| 57 | === 3. Извештај за процент на изнајмени недвижности во однос на објавени огласи за секоја година. |
| 58 | {{{ |
| 59 | WITH 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 | ), |
| 66 | converted_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 | ) |
| 74 | SELECT |
| 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 |
| 79 | FROM total_listings tl |
| 80 | LEFT JOIN converted_listings cl ON tl.year = cl.year |
| 81 | ORDER BY tl.year; |
| 82 | }}} |
| 83 | |
| 84 | |
| 85 | === 4. Извештај за раст на приходи (извршени успешни плаќања за изнајмувања) за претходна и тековна година за секој град изразена во проценти. |
| 86 | {{{ |
| 87 | |
| 88 | WITH 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 | ), |
| 102 | diffs 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 | ) |
| 112 | SELECT * |
| 113 | FROM diffs |
| 114 | ORDER BY growth_percent DESC; |
| 115 | |
| 116 | }}} |
| 117 | |
| 118 | === 5. Извештај за цени за изнајмување на недвижности (просечна, минимална, максимална и цена по метар квадратен) согласно категорија на објект, град, број на соби, големина на објект. |
| 119 | {{{ |
| 120 | |
| 121 | SELECT |
| 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 |
| 135 | FROM Lease l |
| 136 | JOIN Listing li ON l.listing_id = li.id |
| 137 | JOIN Unit u ON li.unit_id = u.id |
| 138 | JOIN Property p ON u.property_id = p.id |
| 139 | JOIN PropertyType pt ON p.property_type_id = pt.id |
| 140 | JOIN Address a ON p.address_id = a.id |
| 141 | WHERE l.start_date >= CURRENT_DATE - INTERVAL '12 months' |
| 142 | GROUP BY pt.name, a.city, u.bedrooms, size_category |
| 143 | HAVING COUNT(l.id) >= 1 |
| 144 | ORDER BY a.city, pt.name, u.bedrooms; |
| 145 | }}} |
| 146 | |
| 147 | === 6. Извештај за последната година за тоа колку просечно денови во секој месец огласите биле изложени пред да биде склучен договор за нив. |
| 148 | {{{ |
| 149 | SELECT |
| 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 |
| 154 | FROM Listing li |
| 155 | JOIN Lease l ON li.id = l.listing_id |
| 156 | WHERE li.available_from >= CURRENT_DATE - INTERVAL '365 days' AND l.start_date BETWEEN li.available_from AND li.available_to |
| 157 | GROUP BY year, month |
| 158 | ORDER BY year, month; |
| 159 | }}} |
| 160 | |
| 161 | === 7. Извештај за број на барања за поправка/сервисирање на недвижност по град |
| 162 | {{{ |
| 163 | SELECT |
| 164 | a.city, |
| 165 | COUNT(sr.id) AS request_count |
| 166 | FROM ServiceRequest sr |
| 167 | JOIN Lease l ON sr.lease_id = l.id |
| 168 | JOIN Listing li ON l.listing_id = li.id |
| 169 | JOIN Unit u ON li.unit_id = u.id |
| 170 | JOIN Property p ON u.property_id = p.id |
| 171 | JOIN Address a ON p.address_id = a.id |
| 172 | WHERE EXTRACT(YEAR FROM sr.request_date) = EXTRACT(YEAR FROM CURRENT_DATE) |
| 173 | GROUP BY a.city |
| 174 | ORDER BY request_count DESC |
| 175 | }}} |
| 176 | |
| 177 | === 8. Извештај за заинтересираност на изнајмувачи, издавачи со најмногу заинтересирани огласи сортирани по популарност |
| 178 | |
| 179 | {{{ |
| 180 | SELECT |
| 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 |
| 188 | FROM LandlordProfile lp |
| 189 | JOIN UserD u ON lp.id = u.id |
| 190 | JOIN Property p ON p.owner_id = u.id |
| 191 | JOIN Unit un ON un.property_id = p.id |
| 192 | JOIN Listing li ON li.unit_id = un.id |
| 193 | JOIN Address a ON p.address_id = a.id |
| 194 | LEFT JOIN Interested i ON li.id = i.listing_id |
| 195 | WHERE li.available_from >= CURRENT_DATE - INTERVAL '12 months' |
| 196 | GROUP BY u.id, u.first_name, u.last_name, u.email, a.city |
| 197 | HAVING COUNT(i.tenant_profile_id) > 0 |
| 198 | ORDER BY total_interested_tenants DESC; |
| 199 | }}} |