= Преглед: v_company_billing_overview = ||= Датотека ||= `views/08_company_billing_view.sql` || ||= Шема ||= `kbnteam` || ||= Категорија ||= Договори, Фактурирање и Верност || ||= Поврзани индекси ||= `indexes/v_company_billing_overview_index.sql` || == Опис == Прикажува вкупни износи на фактури, бројот на нарачки на купувачи и бројот на договори по компанија. Користи два CTE: `company_contracts` го брои бројот на договори по компанија, а `invoice_totals` ги агрегира вкупните износи по фактура. Важен преглед за финансиски извештај и прикажување на фактури во администраторски панел. == Зависности == ||= Табела ||= Тип на употреба || || `kbnteam.invoice` || Главна табела || || `kbnteam.company_order` || JOIN — компаниска нарачка || || `kbnteam.customer_order` || LEFT JOIN — нарачки (за вкупен износ) || || `kbnteam.contract` || LEFT JOIN (CTE) — договори на компанијата || || `kbnteam.company` || JOIN — компанија || == Излезни колони == ||= Колона ||= Извор ||= Опис || || `invoice_id` || `invoice` || Примарен клуч на фактурата || || `comp_order_id` || `invoice` || Поврзана компаниска нарачка || || `company_id` || `company` || ID на компанијата || || `company_name` || `company` || Назив на компанијата || || `company_address` || `company` || Адреса на компанијата || || `delivery_id` || `company_order` || ID на доставата || || `customer_order_count` || CTE `invoice_totals` || Број нарачки на купувачи || || `invoice_amount` || CTE `invoice_totals` || Вкупен износ на фактурата || || `contract_count` || CTE `company_contracts` || Број на договори на компанијата || == SQL Дефиниција == {{{ #!sql CREATE OR REPLACE VIEW kbnteam.v_company_billing_overview AS WITH company_contracts AS ( SELECT ct.company_id, COUNT(*) AS contract_count FROM kbnteam.contract ct GROUP BY ct.company_id ), invoice_totals AS ( SELECT i.invoice_id, i.comp_order_id, co.company_id, co.delivery_id, COUNT(o.order_id) AS customer_order_count, COALESCE(SUM(o.order_total), 0)::numeric(14,2) AS invoice_amount FROM kbnteam.invoice i JOIN kbnteam.company_order co ON co.comp_order_id = i.comp_order_id LEFT JOIN kbnteam.customer_order o ON o.comp_order_id = co.comp_order_id GROUP BY i.invoice_id, i.comp_order_id, co.company_id, co.delivery_id ) SELECT it.invoice_id, it.comp_order_id, cmp.company_id, cmp.company_name, cmp.company_address, it.delivery_id, it.customer_order_count, it.invoice_amount, COALESCE(cc.contract_count, 0) AS contract_count FROM invoice_totals it JOIN kbnteam.company cmp ON cmp.company_id = it.company_id LEFT JOIN company_contracts cc ON cc.company_id = cmp.company_id; }}} == Тестирање на перформанси == === Препорачано тест прашање === {{{ #!sql SET search_path TO kbnteam; SET statement_timeout = '60s'; -- Тест 1: по компанија EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_company_billing_overview WHERE company_id = 1; -- Тест 2: по компаниска нарачка EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_company_billing_overview WHERE comp_order_id = 1; }}} === Резултати пред индексирање === ||= Метрика ||= Тест 1 (company_id) ||= Тест 2 (comp_order_id) || || Planning Time || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || || Rows Returned || ___ || ___ || || contract scan || ___ || ___ || || customer_order scan || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) }}} === Применети индекси === {{{ #!sql -- indexes/v_company_billing_overview_index.sql CREATE INDEX IF NOT EXISTS idx_contract_company_id ON kbnteam.contract (company_id); CREATE INDEX IF NOT EXISTS idx_customer_order_comp_order_id ON kbnteam.customer_order (comp_order_id); }}} === Резултати по индексирање === ||= Метрика ||= Тест 1 (company_id) ||= Тест 2 (comp_order_id) || || Planning Time || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || || Rows Returned || ___ || ___ || || contract scan || ___ || ___ || || customer_order scan || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (по индексирање) }}} === Анализа на подобрување === ||= Индекс ||= Помага на ||= Очекувана промена || || `idx_contract_company_id` || CTE `company_contracts` GROUP BY || Seq Scan → Index Scan на `contract` || || `idx_customer_order_comp_order_id` || CTE `invoice_totals` LEFT JOIN || Seq Scan → Index Scan на `customer_order` || ||= Метрика ||= Пред ||= По ||= Δ Подобрување || || Execution Time (Тест 1) || ___ ms || ___ ms || ___ % || || Execution Time (Тест 2) || ___ ms || ___ ms || ___ % ||