фото контакта

Пример работы с SQL запросами:
определение объёмов и стоимости услуг по передаче электроэнергии

Описание базы данных SQL

Общая информация о базе
схема

Данные о расходе электроэнергии собраны за 2020-2023 годы.
Сетевая организация имеет в структуре 2 филиала какждому из которых подчинены по несколько РЭС.
РЭС обслуживают 8,6 тыс. потребителей которые владеют более 38 тыс. объектами электросетевого хозяйства (далее - ЭСХ)
Объекты ЭСХ потребителей расположены на территориях 20-ти субъектов РФ.
На основании имеющихся данных с использованием SQL запросов реализован расчет балансов электроэнергии с разбивкой по уровням напряжения, а также определены стоимости услуг по передаче электроэнергии и стоимость покупки электроэнергии в целях компенсации потерь. Кроме-того реализован отбор данных по различным критериям.
База данных SQL состоит из 9-ти таблиц, имеющих между собой следующие связи см. рисунок.

Коды SQL запросов
• Контрагенты • Объекты ЭСХ

    SELECT
    row_number() OVER(ORDER BY ZZ.ID) AS num,
    ZZ.ID AS ID,
    ZZ.client AS client,
    ZZ.filial AS filial,
    ZZ.res AS res,
    ZZ.region AS region
    FROM
    (
    SELECT DISTINCT
    c.`id` AS ID,
    c.name AS client,
    dvf.div_name AS filial,
    dv.div_name AS res,
    rg.reg AS region
    FROM `client` c
    LEFT JOIN `object` o ON `o`.`id_client` = `c`.`id`
    LEFT JOIN `div-reg` dvrg ON `dvrg`.`id` = `o`.`id_div-reg`
    LEFT JOIN `division` dv ON `dv`.`id` = `dvrg`.`id_division`
    LEFT JOIN `division` dvf ON `dvf`.`id` = `dv`.`id_parent`
    LEFT JOIN `region` rg ON `rg`.`id` = `dvrg`.`id_region`
    ) ZZ
    WHERE ZZ.client LIKE '%ФСК%'
    ORDER BY ZZ.ID ASC

SELECT
row_number() OVER(ORDER BY ZZ.id) AS num,
ZZ.id AS id,
ZZ.object_name AS object_name,
ZZ.group_name AS group_name,
ZZ.client_name AS client_name,
ZZ.res AS res,
ZZ.filial AS filial,
ZZ.region AS region
FROM
(
SELECT
o.id AS id,
o.name AS object_name,
gr.name AS group_name,
cl.name AS client_name,
dvr.div_name AS res,
dvf.div_name AS filial,
r.reg AS region
FROM `object` o
LEFT JOIN `group` gr ON `gr`.`id` = `o`.`id_group`
LEFT JOIN `client` cl ON cl.`id` = `o`.`id_client`
LEFT JOIN `div-reg` dvrg ON `dvrg`.`id` = `o`.`id_div-reg`
LEFT JOIN `division` dvr ON `dvr`.`id` = `dvrg`.`id_division`
LEFT JOIN `region` r ON `r`.`id` = `dvrg`.`id_region`
LEFT JOIN `division` dvf ON dvf.id = dvr.id_parent
) ZZ

• Тарифы • Баланс по обществу

    SELECT
    row_number() OVER(ORDER BY ZZ.reg_id, ZZ.gr_id, ZZ.volt_id) AS num,
    ZZ.reg_name,
    ZZ.gr_name,
    ZZ.volt_name,
    ZZ.data1,
    ZZ.data2,
    ZZ.tarif
    FROM (
    SELECT DISTINCT
    r.id AS reg_id,
    r.reg AS reg_name,
    g.id AS gr_id,
    g.name AS gr_name,
    IF(p.id_volt IS null,0,v.id) AS volt_id,
    IF(p.id_volt IS null,'-', v.name) AS volt_name,
    p.data1 AS data1,
    p.data2 AS data2,
    p.tarif
    FROM `prise` p
    JOIN `group` g ON `g`.`id`=`p`.`id_group`
    JOIN `region` r ON `r`.`id` = `p`.`id_region`
    JOIN `volt` v ON `v`.`id` = `p`.`id_volt` OR `p`.`id_volt` IS NULL
    )ZZ
    ORDER BY ZZ.reg_id ASC, ZZ.gr_id ASC, ZZ.volt_id ASC

SELECT
Z.reg,
Z.filial,
Z.res,
Z.volt_name,
IFNULL(SUM(Z.priem),0) AS priem,
IFNULL(SUM(Z.po_so),0)+IFNULL(SUM(Z.po_org),0)+IFNULL(SUM(Z.po_nas),0) AS po_vsg,
IFNULL(SUM(Z.po_so),0) AS po_so,
IFNULL(SUM(Z.po_org),0) AS po_org,
IFNULL(SUM(Z.po_nas),0) AS po_nas
FROM (
SELECT
ZZ.dt AS dt,
ZZ.reg AS reg,
ZZ.filial AS filial,
ZZ.res AS res,
ZZ.volt_name AS volt_name,
ZZ.volt_id AS volt_id,
SUM(CASE WHEN ZZ.group_id = 1 THEN ZZ.val END) AS priem,
SUM(CASE WHEN ZZ.group_id = 2 THEN ZZ.val END) AS po_so,
SUM(CASE WHEN ZZ.group_id = 3 THEN ZZ.val END) AS po_org,
SUM(CASE WHEN ZZ.group_id = 4 THEN ZZ.val END) AS po_nas
FROM (
SELECT
s.date AS dt,
r.reg AS reg,
df.div_name AS filial,
d.div_name AS res,
g.`name` AS group_name,
g.`id` AS group_id,
v.name AS volt_name,
v.id AS volt_id,
s.value AS val
FROM `sales` s
LEFT JOIN `object` o ON `o`.`id` = s.id_object
LEFT JOIN `div-reg`dvrg ON dvrg.`id` = o.`id_div-reg`
LEFT JOIN `region` r ON `r`.`id` = `dvrg`.`id_region`
LEFT JOIN `division` d ON `d`.`id` = `dvrg`.`id_division`
LEFT JOIN `division` df ON `df`.`id` = `d`.`id_parent`
LEFT JOIN `volt` v ON `v`.`id` = `s`.`id_volt`
LEFT JOIN `group` g ON `g`.`id` = `o`.`id_group`
WHERE s.date BETWEEN '2023-12-01' AND '2023-12-31'
) ZZ
WHERE ZZ.res LIKE '%Владимирский%'
GROUP BY ZZ.dt, ZZ.reg, ZZ.filial, ZZ.res, ZZ.volt_name
) Z
GROUP BY Z.reg, Z.filial, Z.res, Z.volt_name
ORDER BY Z.reg, Z.filial, Z.res, Z.volt_id

• Стоимость

    SELECT
    Z3.dt AS dt,
    Z3.id_filial AS id_filial,
    Z3.filial_name AS filial,
    Z3.id_reg AS id_reg,
    Z3.reg_name AS reg_name,
    Z3.id_group AS id_group,
    Z3.group_name AS group_name,
    Z3.id_volt AS id_volt,
    Z3.volt_name AS volt_name,
    IFNULL(p.tarif, 0) AS tarif,
    Z3.poteri AS poteri,
    IF(Z3.id_group=5, SUM(Z3.poteri) OVER(PARTITION BY CONCAT(Z3.dt,'',Z3.id_reg)), Z3.val) AS val,
    ROUND(IFNULL(p.tarif, 0)*IF(Z3.id_group=5, SUM(Z3.poteri) OVER(PARTITION BY CONCAT(Z3.dt,'',Z3.id_reg)), Z3.val),2) AS cost
    FROM
    (
    SELECT
    Z2.id_filial AS id_filial,
    Z2.filial_name AS filial_name,
    Z2.id_reg AS id_reg,
    Z2.reg_name AS reg_name,
    Z2.id_group AS id_group,
    Z2.group_name AS group_name,
    Z2.id_volt AS id_volt,
    IFNULL(Z2.volt_name, '-') AS volt_name,
    Z2.dt AS dt,
    Z2.val AS val,
    Z2.poteri AS poteri
    FROM
    (
    SELECT
    Z1.id_filial AS id_filial,
    Z1.filial_name AS filial_name,
    Z1.id_reg AS id_reg,
    Z1.reg_name AS reg_name,
    Z1.id_group AS id_group,
    Z1.group_name AS group_name,
    Z1.id_volt AS id_volt,
    Z1.volt_name AS volt_name,
    Z1.dt AS dt,
    SUM(Z1.val) AS val,
    SUM(Z1.poteri) AS poteri
    FROM
    (
    SELECT
    s.id AS id_sales,
    df.id AS id_filial,
    df.div_name AS filial_name,
    dr.id AS id_res,
    dr.div_name AS res_name,
    r.id AS id_reg,
    r.reg AS reg_name,
    g.id AS id_group,
    g.name AS group_name,
    IF(g.id = 3, s.id_volt, NULL) AS id_volt,
    IF(g.id = 3, v.name, NULL) AS volt_name,
    s.date AS dt,
    s.value AS val,
    IF(g.id = 1, s.value, - s.value) AS poteri
    FROM
    `sales` s
    JOIN `object` o ON
    `o`.`id` = `s`.`id_object`
    JOIN `div-reg` dvrg ON
    `dvrg`.`id` = `o`.`id_div-reg`
    JOIN `division` dr ON
    `dr`.`id` = `dvrg`.`id_division`
    JOIN `division` df ON
    `df`.`id` = `dr`.`id_parent`
    JOIN `region` r ON
    `r`.`id` = `dvrg`.`id_region`
    JOIN `volt` v ON
    `v`.`id` = `s`.`id_volt`
    JOIN `group` g ON
    `g`.`id` = `o`.`id_group`
    ) Z1
    GROUP BY
    Z1.id_filial,
    Z1.filial_name,
    Z1.id_reg,
    Z1.reg_name,
    Z1.id_group,
    Z1.group_name,
    Z1.id_volt,
    Z1.volt_name,
    Z1.dt
    ) Z2
    UNION
    SELECT
    `df`.`id` AS id_filial,
    `df`.`div_name` AS filial_name,
    `r`.`id` AS id_reg,
    `r`.`reg` AS reg_name,
    `g`.`id` AS id_group,
    `g`.`name` AS group_name,
    NULL AS id_volt,
    '-' AS volt_name,
    `p`.`data2` - INTERVAL 1 DAY AS dt,
    0 AS val,
    0 AS poteri
    FROM
    `price` p
    JOIN `group` g ON
    `g`.`id` = `p`.`id_group` AND `g`.`id` = 5
    JOIN `region` r ON
    `r`.`id` = `p`.`id_region`
    JOIN `div-reg` dvrg ON
    `dvrg`.`id_region` = `p`.`id_region`
    JOIN `division` dr ON
    `dr`.`id` = `dvrg`.`id_division`
    JOIN `division` df ON
    `df`.`id` = `dr`.`id_parent`
    ) Z3
    LEFT JOIN `price` p ON
    `p`.`id_region` = Z3.id_reg AND `p`.`id_group` = Z3.id_group AND IF(
    `p`.`id_volt` IS NULL,
    TRUE,
    `p`.`id_volt` = Z3.id_volt
    ) AND Z3.dt BETWEEN `p`.`data1` AND `p`.`data2`
    ORDER BY
    Z3.dt,
    Z3.id_filial,
    Z3.id_reg,
    Z3.id_group,
    Z3.id_volt