#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 имени таблицы для управляемой таблицы, проверьте сейчас, пожалуйста