| 9 | | Прикажува вкупни износи на фактури, бројот на нарачки на купувачи и бројот на договори по компанија. Користи два CTE: `company_contracts` го брои бројот на договори по компанија, а `invoice_totals` ги агрегира вкупните износи по фактура. Важен преглед за финансиски извештај и прикажување на фактури во администраторски панел. |
| | 9 | |
| | 10 | За секоја фактура ги прикажува компанијата, доставата, бројот на клиентски нарачки, нивниот вкупен износ и бројот на договори на компанијата. |
| | 11 | |
| | 12 | Износот на фактурата е збир од поврзаните клиентски нарачки. Бројот на договори се пресметува одделно. Фактурите без клиентски нарачки имаат број и износ еднакви на нула. |
| | 13 | |
| | 14 | Еден ред за секоја фактура. Износот е збир од нарачките, а не пресметка на платено или преостанато салдо. |
| 12 | | ||= Табела ||= Тип на употреба || |
| 13 | | || `kbnteam.invoice` || Главна табела || |
| 14 | | || `kbnteam.company_order` || JOIN — компаниска нарачка || |
| 15 | | || `kbnteam.customer_order` || LEFT JOIN — нарачки (за вкупен износ) || |
| 16 | | || `kbnteam.contract` || LEFT JOIN (CTE) — договори на компанијата || |
| 17 | | || `kbnteam.company` || JOIN — компанија || |
| | 17 | |
| | 18 | ||= Табела / преглед ||= Употреба || |
| | 19 | || `kbnteam.contract` || Договори меѓу компаниите и рестораните. || |
| | 20 | || `kbnteam.invoice` || Фактури поврзани со компаниските нарачки. || |
| | 21 | || `kbnteam.company_order` || Поврзување на компаниските нарачки со компанијата и доставата. || |
| | 22 | || `kbnteam.company` || Податоци за компаниите. || |
| | 23 | || `kbnteam.customer_order` || Клиентски нарачки, датуми, статуси и износи. || |
| 20 | | ||= Колона ||= Извор ||= Опис || |
| 21 | | || `invoice_id` || `invoice` || Примарен клуч на фактурата || |
| 22 | | || `comp_order_id` || `invoice` || Поврзана компаниска нарачка || |
| 23 | | || `company_id` || `company` || ID на компанијата || |
| 24 | | || `company_name` || `company` || Назив на компанијата || |
| 25 | | || `company_address` || `company` || Адреса на компанијата || |
| 26 | | || `delivery_id` || `company_order` || ID на доставата || |
| 27 | | || `customer_order_count` || CTE `invoice_totals` || Број нарачки на купувачи || |
| 28 | | || `invoice_amount` || CTE `invoice_totals` || Вкупен износ на фактурата || |
| 29 | | || `contract_count` || CTE `company_contracts` || Број на договори на компанијата || |
| 31 | | == SQL Дефиниција == |
| | 27 | ||= Колона ||= Извор / пресметка ||= Опис || |
| | 28 | || `invoice_id` || `invoice.invoice_id` || Идентификатор на фактурата. || |
| | 29 | || `comp_order_id` || `invoice.comp_order_id` || Идентификатор на компаниската нарачка. || |
| | 30 | || `company_id` || `company.company_id` || Идентификатор на компанијата. || |
| | 31 | || `company_name` || `company.company_name` || Назив на компанијата. || |
| | 32 | || `company_address` || `company.company_address` || Адреса на компанијата. || |
| | 33 | || `delivery_id` || `company_order.delivery_id` || Идентификатор на доставата. || |
| | 34 | || `customer_order_count` || `COUNT(customer_order.order_id)` || Број на клиентски нарачки. || |
| | 35 | || `invoice_amount` || `COALESCE(SUM(customer_order.order_total), 0)::numeric(14,2)` || Збир на износите на нарачките поврзани со фактурата. || |
| | 36 | || `contract_count` || `COALESCE(company_contracts.contract_count, 0)` || Број на договори на компанијата. || |
| | 37 | |
| | 38 | == SQL дефиниција == |
| | 39 | |
| 36 | | SELECT |
| 37 | | ct.company_id, |
| 38 | | COUNT(*) AS contract_count |
| 39 | | FROM kbnteam.contract ct |
| 40 | | GROUP BY ct.company_id |
| 41 | | ), |
| 42 | | invoice_totals AS ( |
| 43 | | SELECT |
| 44 | | i.invoice_id, |
| 45 | | i.comp_order_id, |
| 46 | | co.company_id, |
| 47 | | co.delivery_id, |
| 48 | | COUNT(o.order_id) AS customer_order_count, |
| 49 | | COALESCE(SUM(o.order_total), 0)::numeric(14,2) AS invoice_amount |
| 50 | | FROM kbnteam.invoice i |
| 51 | | JOIN kbnteam.company_order co ON co.comp_order_id = i.comp_order_id |
| 52 | | LEFT JOIN kbnteam.customer_order o ON o.comp_order_id = co.comp_order_id |
| 53 | | GROUP BY i.invoice_id, i.comp_order_id, co.company_id, co.delivery_id |
| | 44 | SELECT company_id, COUNT(*) AS contract_count |
| | 45 | FROM kbnteam.contract |
| | 46 | GROUP BY company_id |
| 65 | | FROM invoice_totals it |
| 66 | | JOIN kbnteam.company cmp ON cmp.company_id = it.company_id |
| 67 | | LEFT JOIN company_contracts cc ON cc.company_id = cmp.company_id; |
| | 58 | FROM kbnteam.invoice i |
| | 59 | JOIN kbnteam.company_order co ON co.comp_order_id = i.comp_order_id |
| | 60 | JOIN kbnteam.company cmp ON cmp.company_id = co.company_id |
| | 61 | LEFT JOIN kbnteam.customer_order o ON o.comp_order_id = co.comp_order_id |
| | 62 | LEFT JOIN company_contracts cc ON cc.company_id = cmp.company_id |
| | 63 | GROUP BY i.invoice_id, i.comp_order_id, cmp.company_id, |
| | 64 | cmp.company_name, cmp.company_address, co.delivery_id, cc.contract_count; |
| 101 | | === Применети индекси === |
| | 108 | === Дополнителни и заеднички индекси === |
| | 109 | |
| | 110 | `invoice(comp_order_id)` има уникатен индекс. За пребарувањето и агрегациите се користат заедничките индекси за нарачки и договори; не е потребен посебен индекс само на contract(company_id). |
| | 111 | |
| | 112 | ||= Индекс ||= Табела и колони ||= Намена || |
| | 113 | || `idx_company_order_company_id` || `company_order(company_id)` || Пронаоѓање компаниски нарачки по компанија. || |
| | 114 | || `idx_customer_order_comp_order_id` || `customer_order(comp_order_id)` || Пронаоѓање клиентски нарачки по компаниска нарачка. || |
| | 115 | || `idx_contract_company_id_rest_id` || `contract(company_id, rest_id)` || Пребарување договори по компанија и ресторан и групирање по компанија. || |
| | 116 | |
| | 124 | |
| | 125 | CREATE INDEX IF NOT EXISTS idx_contract_company_id_rest_id |
| | 126 | ON kbnteam.contract (company_id, rest_id); |
| | 127 | }}} |
| | 128 | |
| | 129 | === Проверка на индексите === |
| | 130 | |
| | 131 | {{{ |
| | 132 | #!sql |
| | 133 | SELECT tablename, indexname, indexdef |
| | 134 | FROM pg_indexes |
| | 135 | WHERE schemaname = 'kbnteam' |
| | 136 | AND indexname IN ( |
| | 137 | 'idx_company_order_company_id', |
| | 138 | 'idx_customer_order_comp_order_id', |
| | 139 | 'idx_contract_company_id_rest_id' |
| | 140 | ) |
| | 141 | ORDER BY tablename, indexname; |