oleja1ee7
@oleja1ee7

Почему запрос объединяет не те строки?

Здравствуйте, помогите исправить ошибку в запросе:
Есть таблица:
5c3cb2c6e1836632226983.png
SELECT 
    reservtable.sudovlad,
    reservtable.summa,
    reservtable.years,
    ((reservtable2.summa2 - reservtable.summa) / reservtable.summa * 100) AS percent,
    reservtable2.summa2,
    reservtable2.years2
FROM
    (SELECT 
        sudovlad,
            SUM(gruz_pass) AS summa,
            EXTRACT(YEAR FROM data_vih_p_ot) AS years
    FROM
        ships
    WHERE
        sudovlad IN ('Русфлот, ООО', 'АрктикТранс ОИЛ, ООО','pere')
    GROUP BY EXTRACT(YEAR FROM data_vih_p_ot)) reservtable,
    (SELECT 
        sudovlad,
            SUM(gruz_pass) AS summa2,
            EXTRACT(YEAR FROM data_vih_p_ot) AS years2
    FROM
        ships
    WHERE
        sudovlad IN ('Русфлот, ООО', 'АрктикТранс ОИЛ, ООО','pere')
    GROUP BY EXTRACT(YEAR FROM data_vih_p_ot)) reservtable2
WHERE
    reservtable.years = 2018
        OR reservtable2.years2 = 2017

Выводит результат
5c3cb2b01f984937382222.png
Необходимо, чтобы результат был вида:
Русфлот, ООО' 14 2018 -22,2 18 2017
АрктикТранс ОИЛ 28 2018 100 0 2017
pere 69 2018 475 12 2017

У какого-либо судовладельца есть данные за 2018 и 2017 год перевозки, бывает такое, что перевозчик в 2017 или в 2018 году не участвовал в перевозках, поэтому данные только за один год.
Но необходимо получить сводную таблицу в которой:
  1. Судовладелец
  2. Количество перевезенного груза
  3. 2018 год
  4. Процент как разница
  5. Количество перевезенного груза
  6. 2017 год


Если данных нет, например за 2017 год, чтоб те столбцы имели 0 или ничего вообще.
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
Delgus
@Delgus
Лучше Join'ы для таких запросов использовать
SELECT 
    ships.sudovlad,
    s1.gruz_pass as summa,
    EXTRACT(YEAR FROM s1.data_vih_p_ot) as years,
    ((s2.gruz_pass - s1.gruz_pass) / s1.gruz_pass * 100) AS percent,
    s2.gruz_pass as summa2,
    EXTRACT(YEAR FROM s2.data_vih_p_ot) AS years2
FROM ships
LEFT JOIN ships as s1
ON ships.sudovlad = s1.sudovlad AND EXTRACT(YEAR FROM s1.data_vih_p_ot)=2017 AND s1.sudovlad IN ('Русфлот, ООО', 'АрктикТранс ОИЛ, ООО','pere')
LEFT JOIN ships as s2
ON ships.sudovlad = s2.sudovlad AND EXTRACT(YEAR FROM s2.data_vih_p_ot)=2018 AND s2.sudovlad IN ('Русфлот, ООО', 'АрктикТранс ОИЛ, ООО','pere')
GROUP BY sudovlad
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы