wiki:CompanyBillingOverviewView

Version 1 (modified by 185022, 2 weeks ago) ( diff )

--

Преглед: 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 Дефиниција

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;

Тестирање на перформанси

Препорачано тест прашање

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 овде (пред индексирање)

Применети индекси

-- 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 _ %
Note: See TracWiki for help on using the wiki.