MYSQL- средняя зарплата за определенные годы между 3 базами данных

#mysql #sql #average #union #aggregate-functions

#mysql #sql #средняя #профсоюз #агрегат-функции

Вопрос:

Я работаю в среде PHPMYADMIN. Моя цель состояла в том, чтобы загрузить данные из Интернета, которые описывают судей, регионы, в которых они работают, файлы, которые они сделали, количество решений, их зарплаты и тому подобные вещи, которые я загружаю в свои базы данных. Над этим проектом работали 5 человек, создав 5 различных баз данных, каждая из которых символизирует конкретный регион (часть страны), в котором работают судьи. Теперь моя цель — например, найти судью (работающего между 5 базами данных) с наибольшим количеством решений или с самой высокой зарплатой за конкретный год, средней зарплатой судьи за конкретный год и тому подобными вещами. Проблема, с которой я столкнулся, вероятно, заключается в том, что я загрузил данные в PHPMYADMIN, создал 5 баз данных, каждая из которых представляет один регион, и я наткнулся здесь на ошибку, что, используя этот дисплей, я нашел судью с самой высокой зарплатой за 2018 год:

 select id_sudca
     , plat_2018 
  from sudy_sk.enrichment_platy 
 union all 
select id_sudcu
     , prijem_2018 
  from nabozny1.m_priznania 
 union all 
select id_priznania
     , prijmy_za_rok_2018 
  from putrovec.majetkove_priznania 
 order 
    by plat_2018;
 

И с этой точки зрения я нашел среднюю зарплату судьи за 2018 год:

 select AVG(plat_2018) FROM(select id_sudca, plat_2018 from sudy_sk.enrichment_platy union all select id_sudcu, prijem_2018 from nabozny1.m_priznania union all select id_priznania, prijmy_za_rok_2018 from putrovec.majetkove_priznania) tablealias;
 

И дело в том, что я думаю о дисплее, который бы определял, какой год (в базе данных, с которой я работаю, 2018-2015 годы, конечно, я использовал вышеупомянутые дисплеи за эти оставшиеся годы как 2017,2016,2015) был в среднем лучшим / худшим для судей, просто в среднем в каком годуони заработали больше всего (всех судей выгнали) и в которых, по крайней мере.

Я придумал похожий дисплей (но, честно говоря, он выглядит ужасно, мне это совсем не нравится) и то, что, по сути, даже неправильно.

 select AVG(platy) FROM (select id_sudca, plat_2018 from sudy_sk.enrichment_platy union all select id_sudcu, prijem_2018 from nabozny1.m_priznania union all select id_priznania, prijmy_za_rok_2018 from putrovec.majetkove_priznania order by plat_2018 UNION ALL

select id_sudca, plat_2017 from sudy_sk.enrichment_platy union all select id_sudcu, prijem_2017 from nabozny1.m_priznania union all select id_priznania, prijmy_za_rok_2017 from putrovec.majetkove_priznania order by plat_2017 UNION ALL

select id_sudca, plat_2016 from sudy_sk.enrichment_platy union all select id_sudcu, prijem_2016 from nabozny1.m_priznania union all select id_priznania, prijmy_za_rok_2016 from putrovec.majetkove_priznania order by plat_2016 UNION ALL

select id_sudca, plat_2015 from sudy_sk.enrichment_platy union all select id_sudcu, prijem_2015 from nabozny1.m_priznania union all select id_priznania, prijmy_za_rok_2015 from putrovec.majetkove_priznania order by plat_2015);
 

Я работаю между 5 базами данных, но я решаю вопросы заработной платы только между 3 базами данных.
Поэтому я хотел бы посоветовать или помочь с правильным синтаксисом отображения.

Комментарии:

1. «5 человек работали над этим проектом, создавая 5 разных баз данных» Почему??? Почему вы не используете контроль версий вместо 5 дублированных баз данных?

2. все судьи выгнаны — что это значит?

3. Слишком много слов, недостаточно данных. Пожалуйста, добавьте дату выборки и ожидаемый результат в виде текста к вопросу. Небольшого количества записей из 2 таблиц должно быть достаточно.

Ответ №1:

Вы можете добавить буквальное значение к каждому union элементу, чтобы указать, какому году оно соответствует, а затем агрегировать во внешнем запросе:

 select yr, avg(plat) as avg_plat
from (
    select 2018 as yr, id_sudca, plat_2018 as plat from sudy_sk.enrichment_platy 
    union all select 2018, id_sudcu, prijem_2018 from nabozny1.m_priznania 
    union all select 2018, id_priznania, prijmy_za_rok_2018 from putrovec.majetkove_priznania 
    union all select 2017, id_sudca, plat_2017 from sudy_sk.enrichment_platy 
    union all select 2017, id_sudcu, prijem_2017 from nabozny1.m_priznania 
    union all select 2017, id_priznania, prijmy_za_rok_2017 from putrovec.majetkove_priznania 
    union all select 2016, id_sudca, plat_2016 from sudy_sk.enrichment_platy 
    union all select 2016, id_sudcu, prijem_2016 from nabozny1.m_priznania 
    union all select 2016, id_priznania, prijmy_za_rok_2016 from putrovec.majetkove_priznania 
    union all select 2015, id_sudca, plat_2015 from sudy_sk.enrichment_platy 
    union all select 2015, id_sudcu, prijem_2015 from nabozny1.m_priznania 
    union all select 2015, id_priznania, prijmy_za_rok_2015 from putrovec.majetkove_priznania
) t
group by yr
 

Затем, если вы хотите отобразить год с наибольшим средним значением, просто добавьте order by предложение в запрос и сохраните только верхнюю строку:

 order by avg_plat desc limit 1
 

Я бы настоятельно рекомендовал нормализовать ваш дизайн. Все эти данные действительно должны храниться в одной таблице со столбцом, в котором хранится год.

Комментарии:

1. #1064 — Что -то не так в вашем синтаксисе РЯДОМ с ‘group by yr order by AVG_plat desc limit 1’ в строке 16 … Я получил эту ошибку после ввода вашего дисплея

2. @JozefVendel: моя ошибка, в подзапросе отсутствовал псевдоним. Исправлено.

Ответ №2:

Ваша структура довольно странная, у вас есть столбцы на каждый год?

 select AVG(platy) 
FROM 
    (select 2018 yyear,id_sudca, plat_2018 as platy from sudy_sk.enrichment_platy) 
    union all (select 2018 yyear, id_sudcu, prijem_2018 from nabozny1.m_priznania) 
    union all (select 2018 yyear,id_priznania, prijmy_za_rok_2018 from putrovec.majetkove_priznania order by plat_2018 )
    UNION ALL (select 2017 yyear,id_sudca, plat_2017 from sudy_sk.enrichment_platy )
    union all (select id_sudcu, prijem_2017 from nabozny1.m_priznania )
    union all (select id_priznania, prijmy_za_rok_2017 from putrovec.majetkove_priznania order by plat_2017 )
    UNION ALL (select id_sudca, plat_2016 from sudy_sk.enrichment_platy) 
    union all (select id_sudcu, prijem_2016 from nabozny1.m_priznania) 
    union all (select id_priznania, prijmy_za_rok_2016 from putrovec.majetkove_priznania order by plat_2016) 
    UNION ALL (select id_sudca, plat_2015 from sudy_sk.enrichment_platy)
    union all (select id_sudcu, prijem_2015 from nabozny1.m_priznania )
    union all (select id_priznania, prijmy_za_rok_2015 from putrovec.majetkove_priznania order by plat_2015
    );
 

Если вам нужно среднее значение за каждый год, вы можете добавить столбец за год и дополнить GROUP BY его

 select yyear,AVG(platy) 
FROM 
    (   
        (select 2018 yyear,id_sudca, plat_2018 as platy from sudy_sk.enrichment_platy) 
        union all (select 2018 yyear, id_sudcu, prijem_2018 from nabozny1.m_priznania) 
        union all (select 2018 yyear,id_priznania, prijmy_za_rok_2018 from putrovec.majetkove_priznania order by plat_2018 )
        UNION ALL (select 2017 yyear,id_sudca, plat_2017 from sudy_sk.enrichment_platy )
        union all (select 2017 yyear,id_sudcu, prijem_2017 from nabozny1.m_priznania )
        union all (select 2017 yyear,id_priznania, prijmy_za_rok_2017 from putrovec.majetkove_priznania order by plat_2017 )
        UNION ALL (select 2016 yyear,id_sudca, plat_2016 from sudy_sk.enrichment_platy) 
        union all (select 2016 yyear,id_sudcu, prijem_2016 from nabozny1.m_priznania) 
        union all (select 2016 yyear,id_priznania, prijmy_za_rok_2016 from putrovec.majetkove_priznania order by plat_2016) 
        UNION ALL (select 2015 yyear,id_sudca, plat_2015 from sudy_sk.enrichment_platy)
        union all (select 2015 yyear,id_sudcu, prijem_2015 from nabozny1.m_priznania )
        union all (select 2015 yyear,id_priznania, prijmy_za_rok_2015 from putrovec.majetkove_priznania order by plat_2015
        )
    ) t1
GROUP BY yyear;
 

Комментарии:

1. #1064 — Что-то не так в вашем синтаксисе рядом с ‘GROUP BY yyear LIMIT 0, 25’ в строке 18… Я получил эту ошибку после ввода вашего второго дисплея

2. это был mssing имени таблицы для управляемой таблицы, проверьте сейчас, пожалуйста