Задавайте вопросы, мы ответим
Вы не зашли.
dohod2005
+----+--------------+-------------+----------+---------------+
| ID | INN | NameORG | ID_D2005 | NameRab |
+----+--------------+-------------+----------+---------------+
| 1 | 7107547812 | Perspectiva | 7223 | Peterson |
| 2 | 7107547812 | Perspectiva | 7226 | Jaramush |
| 3 | 7107547812 | Perspectiva | 7231 | Sabler |
| 4 | 45623411225 | BlackNoise | 7267 | Peterson |
| 5 | 45623411225 | BlackNoise | 8001 | Karlson |
| 6 | 45623411225 | BlackNoise | 8011 | Svenson |
| 7 | 45623411225 | BlackNoise | 8061 | Shneerson |
| 8 | 680987345515 | Modos | 1002 | Navuhodonosor |
| 9 | 680987345515 | Modos | 1012 | Plumkin |
| 10 | 680987345515 | Modos | 1014 | Solomonson |
| 11 | 680987345515 | Modos | 1035 | Shulmanson |
+----+--------------+-------------+----------+---------------+
dohmes
+----+----------+--------+--------+--------+
| ID | ID_D2005 | nommes | summes | koddoh |
+----+----------+--------+--------+--------+
| 1 | 7223 | 01 | 1000 | 2000 |
| 2 | 7223 | 02 | 1100 | 2000 |
| 3 | 7231 | 03 | 1200 | 2000 |
| 4 | 7231 | 03 | 200 | 2200 |
| 5 | 7267 | 04 | 1300 | 2000 |
| 6 | 7267 | 05 | 1400 | 2000 |
| 7 | 7226 | 01 | 500 | 2000 |
| 8 | 7226 | 02 | 600 | 2000 |
| 9 | 8001 | 03 | 700 | 2500 |
| 10 | 1012 | 04 | 800 | 2000 |
| 11 | 1012 | 05 | 900 | 2000 |
| 12 | 8011 | 08 | 2900 | 2000 |
| 13 | 8011 | 02 | 2800 | 2000 |
| 14 | 1002 | 02 | 290 | 2000 |
| 15 | 1002 | 05 | 190 | 2000 |
| 16 | 1014 | 02 | 1200 | 2000 |
| 17 | 1014 | 03 | 1400 | 2000 |
| 18 | 1014 | 04 | 1600 | 2000 |
| 19 | 1014 | 06 | 1800 | 2000 |
| 20 | 1035 | 07 | 1800 | 2200 |
+----+----------+--------+--------+--------+
можете составить запрос:
Найти все организации в которых не менее 50% работников получали в течении не менее чем 2-х месяцев зарплату не более 1000 рублей.
Структура таблиц:
Create table dohod2005
(ID int(11) auto_increment primary key not null,
INN char(13) not null,
NameORG char(20) not null,
ID_D2005 int(11) not null,
NameRab char(25) not null);
Create table dohmes
(ID int(11) auto_increment primary key,
ID_D2005 int(11) not null,
Nommes char(2) default ‘01’ not null,
Summes int(11) not null,
Koddoh int(11) not null);
Неактивен
Неактивен
Найти все организации в которых не менее 50% работников получали в течении не менее чем 2-х месяцев зарплату не более 1000 рублей.
vasya написал:
select NameORG
from dohod2005 group by NameORG
having count(*) <
(select 2*count(*)
from dohod2005
where ID_D2005 in (select ID_D2005 from dohmes where summes <= 1000
group by ID_D2005
having count(*) > 1)
group by NameORG)
ошибка #1242 - Subquery returns more than 1 row
А можно расписать каждый GROUP BY, Having & count действие по значению?
Отредактированно Геннадий84 (28.03.2020 15:09:17)
Неактивен
также есть запрос:
SELECT A.NameORG,
A.NameRab,
SUM(B.Summes) as sumall
FROM dohod2005 as A
LEFT JOIN dohmes as B ON A.ID_D2005=B.ID_D2005
AND B.koddoh=2000 # связывать ТОЛЬКО зарплаты
GROUP BY A.ID_D2005
ORDER BY A.NameORG;
который считает суммарные зарплаты сотрудников.
Как выбрать из них максимальные для каждой из организаций, что изменить в запросе?
Отредактированно Геннадий84 (28.03.2020 14:52:58)
Неактивен
Геннадий84 написал:
ошибка #1242 - Subquery returns more than 1 row
А можно расписать каждый GROUP BY, Having & count действие по значению?
Неактивен
Геннадий84 написал:
также есть запрос:
SELECT A.NameORG,
A.NameRab,
SUM(B.Summes) as sumall
FROM dohod2005 as A
LEFT JOIN dohmes as B ON A.ID_D2005=B.ID_D2005
AND B.koddoh=2000 # связывать ТОЛЬКО зарплаты
GROUP BY A.ID_D2005
ORDER BY A.NameORG;
который считает суммарные зарплаты сотрудников.
Как выбрать из них максимальные для каждой из организаций, что изменить в запросе?
В https://sqlinfo.ru/articles/info/18.html есть 6 способов решения вашей задачи
Неактивен
vasya написал:
Геннадий84 написал:
ошибка #1242 - Subquery returns more than 1 row
А можно расписать каждый GROUP BY, Having & count действие по значению?-- кол-во работников в каждой конторе
select NameORG, count(*) from dohod2005 t1 group by 1;
-- работники, которые получали в течении не менее чем 2-х месяцев зарплату не более 1000 рублей
select ID_D2005 from dohmes where summes <= 1000 group by 1 having count(*) > 1;
-- кол-во работников, которые получали в течении не менее чем 2-х месяцев зарплату не более 1000 рублей, в каждой фирме
select NameORG, count(*) from dohod2005 t1 where ID_D2005 in
(select ID_D2005 from dohmes where summes <= 1000 group by 1 having count(*) > 1)
group by 1;
-- итоговый запрос
select NameORG from dohod2005 t1 group by 1 having count(*) <=
(select 2 * count(*) from dohod2005 where ID_D2005 in
(select ID_D2005 from dohmes where summes <= 1000 group by 1 having count(*) > 1)
and NameORG = t1.NameORG group by NameORG);
заработало! единственное нужно добавить koddoh=2000 - зарплаты, 2200, 2500 - премии и матпомощь.
select NameORG from dohod2005 t1 group by 1 having count(*) <=
(select 2 * count(*) from dohod2005 where ID_D2005 in
(select ID_D2005 from dohmes where (summes <= 1000) and (koddoh=2000) group by 1 having count(*) > 1)
and NameORG = t1.NameORG group by NameORG);
Отредактированно Геннадий84 (29.03.2020 11:04:30)
Неактивен
vasya написал:
Геннадий84 написал:
также есть запрос:
SELECT A.NameORG,
A.NameRab,
SUM(B.Summes) as sumall
FROM dohod2005 as A
LEFT JOIN dohmes as B ON A.ID_D2005=B.ID_D2005
AND B.koddoh=2000 # связывать ТОЛЬКО зарплаты
GROUP BY A.ID_D2005
ORDER BY A.NameORG;
который считает суммарные зарплаты сотрудников.
Как выбрать из них максимальные для каждой из организаций, что изменить в запросе?В https://sqlinfo.ru/articles/info/18.html есть 6 способов решения вашей задачи
Почитал и не представляю приблизительно как это сделать, может поможете недогоняющему?
Единственное понимаю что нужен Left Join чтобы связать поля NameORG, NamRab, Summes.
Отредактированно Геннадий84 (29.03.2020 13:00:39)
Неактивен
У вас есть таблица - организация, работник, суммарная зарплата.
Нужно для каждой фирмы найти работника с максимальной суммарной зарплатой.
В статье рассматривается пример - юзер, сообщение, дата сообщения.
Нужно выбрать последнее сообщение каждого пользователя.
Отличие только в названии полей.
Неактивен
vasya написал:
У вас есть таблица - организация, работник, суммарная зарплата.
Нужно для каждой фирмы найти работника с максимальной суммарной зарплатой.
В статье рассматривается пример - юзер, сообщение, дата сообщения.
Нужно выбрать последнее сообщение каждого пользователя.
Отличие только в названии полей.
Попробовал так:
Select A.NameORG, A.NameRab, B.MAX(summax)
FROM dohod2005 as A
LEFT JOIN
(Select ID_D2005, SUM(summes) as summax FROM dohmes WHERE koddoh=2000
GROUP BY ID_D2005)
as B ON A.ID_D2005 IN=B. ID_D2005
GROUP BY A.NameORG
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=B. ID_D2005 GROUP BY A.NameORG LIMIT 0, 30' at line 4
Отредактированно Геннадий84 (30.03.2020 09:03:10)
Неактивен
а что такое IN=
и пробел далее после B. тоже лишний
p.s. `A.NameRab` у вас будет произвольный, собственно статья как раз и объясняет почему и что делать.
p.p.s. что должно быть выведено для фирмы, у которой никто из работников вообще не получал зарплату?
Неактивен
vasya написал:
а что такое IN=
и пробел далее после B. тоже лишний
исправил
Select A.NameORG, A.NameRab, B.MAX(summax)
FROM dohod2005 as A
LEFT JOIN (Select ID_D2005, SUM(summes) as summax FROM dohmes WHERE koddoh=2000
GROUP BY ID_D2005) as B ON A.ID_D2005=B.ID_D2005
GROUP BY A.NameORG
ошибка
#1630 - FUNCTION b.MAX does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
vasya написал:
p.s. `A.NameRab` у вас будет произвольный, собственно статья как раз и объясняет почему и что делать.
p.p.s. что должно быть выведено для фирмы, у которой никто из работников вообще не получал зарплату?
там нет фирм в которых никто из работников не получал зарплату, но замечание верное.
Отредактированно Геннадий84 (30.03.2020 10:14:21)
Неактивен
MAX(summax) или MAX(B.summax)
вместо B.MAX(summax)
Неактивен
vasya написал:
MAX(summax) или MAX(B.summax)
вместо B.MAX(summax)
Верно
Select A.NameORG, A.NameRab, MAX(B.summax) as summax
FROM dohod2005 as A
LEFT JOIN (Select ID_D2005, SUM(summes) as summax FROM dohmes WHERE koddoh=2000
GROUP BY ID_D2005) as B ON A.ID_D2005=B.ID_D2005
GROUP BY A.NameORG
теперь A.NameRab неверное выводит как вы и говорили,
проблема в том что 3-е значение у меня выводится из 2-ой таблицы.
Отредактированно Геннадий84 (30.03.2020 13:40:26)
Неактивен
имея NameORG и MAX(B.summax) делаете ещё один join чтобы получить правильный NameRab (см способ №1 в статье)
Неактивен
vasya написал:
имея NameORG и MAX(B.summax) делаете ещё один join чтобы получить правильный NameRab (см способ №1 в статье)
SELECT t.NameORG, t.NameRab, t.summax
FROM (Select A.NameORG, A.NameRab, summax
FROM dohod2005 as A LEFT JOIN (Select ID_D2005, SUM(summes) as summax FROM dohmes AS B WHERE koddoh=2000 GROUP BY B.ID_D2005) ON A.ID_D2005=B.ID_D2005))
as t JOIN
(Select C.NameORG, C.NameRab, MAX(D.summax) as msummax
FROM dohod2005 as C LEFT JOIN (Select ID_D2005, SUM(summes) as summax FROM dohmes AS D WHERE koddoh=2000 GROUP BY D.ID_D2005) GROUP BY B.NameORG) as t1
ON t.NameRab=t1.NameRab AND t.summax = t1.msummax;
#1248 - Every derived table must have its own alias
Неактивен
#1248 - Every derived table must have its own alias
каждая производная таблица (from подзапрос) должна иметь собственный псевдонизм (см ваш вариант в https://sqlinfo.ru/forum/viewtopic.php?pid=48185#p48185)
потеряли условие объединения dohod2005 as C LEFT JOIN (..BY D.ID_D2005) <тут должен быть ON> GROUP BY
Select C.NameORG, C.NameRab, .. -- C.NameRab тут будет произвольным
GROUP BY B.NameORG) as t1
ON t.NameRab=t1.NameRab AND t.summax = t1.msummax; -- NameRab вам ка раз нужно найти, имея NameORG и summax
Неактивен
vasya написал:
#1248 - Every derived table must have its own alias
каждая производная таблица (from подзапрос) должна иметь собственный псевдонизм (см ваш вариант в https://sqlinfo.ru/forum/viewtopic.php?pid=48185#p48185)
ON t.NameRab=t1.NameRab AND t.summax = t1.msummax; -- NameRab вам ка раз нужно найти, имея NameORG и summax
так в том то и проблема что NameRab у меня в одной таблице, а summax в другой.
Как их слепить вместе я уже не пойму.
vasya написал:
имея NameORG и MAX(B.summax) делаете ещё один join чтобы получить правильный NameRab (см способ №1 в статье)
так в том то и дело что я не имею max(B.summax) он получен группировкой по NameORG путём связки из второй таблицы через связь по ID_D2005
псевдонимы вроде расставил "as t" & "as t1".
Да, потерял условие объединения dohod2005 as C LEFT JOIN.
Отредактированно Геннадий84 (01.04.2020 12:44:26)
Неактивен
Геннадий84 написал:
так в том то и дело что я не имею max(B.summax) он получен группировкой по NameORG путём связки из второй таблицы через связь по ID_D2005
Какая разница откуда получен?
У вас есть запрос, дающий имя организации NameORG и максимальную суммарную зарплату сотрудника в этой организации MAX(B.summax).
Результат запроса по сути некая таблица.
И вы правильно джойните её с другой таблицей `t`, полученной запросом
(Select A.NameORG, A.NameRab, summax
FROM dohod2005 as A LEFT JOIN (Select ID_D2005, SUM(summes) as summax FROM dohmes AS B WHERE koddoh=2000 GROUP BY B.ID_D2005) ON A.ID_D2005=B.ID_D2005))
as t
summax есть в обеих производных таблицах
Неактивен
vasya написал:
Геннадий84 написал:
так в том то и дело что я не имею max(B.summax) он получен группировкой по NameORG путём связки из второй таблицы через связь по ID_D2005
Какая разница откуда получен?
У вас есть запрос, дающий имя организации NameORG и максимальную суммарную зарплату сотрудника в этой организации MAX(B.summax).
Результат запроса по сути некая таблица.
И вы правильно джойните её с другой таблицей `t`, полученной запросом
(Select A.NameORG, A.NameRab, summax
FROM dohod2005 as A LEFT JOIN (Select ID_D2005, SUM(summes) as summax FROM dohmes AS B WHERE koddoh=2000 GROUP BY B.ID_D2005) ON A.ID_D2005=B.ID_D2005))
as t
summax есть в обеих производных таблицах
ну ошибка таже самая #1248 - Every derived table must have its own alias
SELECT t.NameORG, t.NameRab, t.summax
FROM (Select A.NameORG, A.NameRab, summax
FROM dohod2005 as A LEFT JOIN (Select ID_D2005, SUM(summes) as summax FROM dohmes AS B WHERE koddoh=2000 GROUP BY B.ID_D2005) ON A.ID_D2005=B.ID_D2005))
as t JOIN
(Select C.NameORG, C.NameRab, MAX(D.summax) as msummax
FROM dohod2005 as C LEFT JOIN (Select ID_D2005, SUM(summes) as summax FROM dohmes AS D WHERE koddoh=2000 GROUP BY D.ID_D2005) ON A.ID_D2005=B.ID_D2005) GROUP BY B.NameORG) as t1
ON t.NameRab=t1.NameRab AND t.summax = t1.msummax;
Неактивен
из 4-ёх замечаний в https://sqlinfo.ru/forum/viewtopic.php?pid=48188#p48188
вы исправили только 2-ое (и кстати, неверно, обратите внимание на псевдонимы)
Неактивен
vasya написал:
из 4-ёх замечаний в https://sqlinfo.ru/forum/viewtopic.php?pid=48188#p48188
вы исправили только 2-ое (и кстати, неверно, обратите внимание на псевдонимы)
#1248 - Every derived table must have its own alias
каждая производная таблица (from подзапрос) должна иметь собственный псевдонизм (см ваш вариант в https://sqlinfo.ru/forum/viewtopic.php?pid=48185#p48185)
Пробую так
SELECT t.NameOrg, t.NameRab, t.summax
FROM (Select NameORG, NameRab, summax
FROM dohod2005
LEFT JOIN (Select SUM(summes) as summax FROM dohmes WHERE koddoh=2000
GROUP BY dohmes.ID_D2005) ON dohod2005.ID_D2005=dohmes.ID_D2005) as t
JOIN
(Select NameOrg, MAX(summax) as msummax
FROM dohod2005
LEFT JOIN (Select SUM(summes) as summax FROM dohmes WHERE koddoh=2000
GROUP BY dohmes.ID_D2005) ON dohod2005.ID_D2005=dohmes.ID_D2005
GROUP BY NameORG) as t1
ON t.NameOrg = t1.NameOrg AND t.summax = t1.msummax;
ошибка таже #1248 - Every derived table must have its own alias
vasya написал:
имея NameORG и MAX(B.summax) делаете ещё один join чтобы получить правильный NameRab (см способ №1 в статье)
Да нет у меня этих двух значений в одной таблице поэтому использую FROM (Select...) as t - так можно?
Отредактированно Геннадий84 (01.04.2020 16:14:02)
Неактивен
1.
Геннадий84 написал:
ошибка таже #1248 - Every derived table must have its own alias
vasya написал:
#1248 - Every derived table must have its own alias
каждая производная таблица (from подзапрос) должна иметь собственный псевдонизм (см ваш вариант в https://sqlinfo.ru/forum/viewtopic.php?pid=48185#p48185)
2.
Геннадий84 написал:
Да нет у меня этих двух значений в одной таблице поэтому использую FROM (Select...) as t - так можно?
да
Неактивен
vasya написал:
1248 - Every derived table must have its own alias
каждая производная таблица (from подзапрос) должна иметь собственный псевдонизм
ВСЁ! Заработало! Спасибо!
SELECT t.NameOrg, t.NameRab, t.summax
FROM
(Select A.NameORG, A.NameRab, B.summax
FROM dohod2005 AS A
LEFT JOIN (Select ID_D2005, SUM(summes) as summax FROM dohmes WHERE koddoh=2000
GROUP BY dohmes.ID_D2005) AS B ON A.ID_D2005=B.ID_D2005)
as t
JOIN
(Select B.NameOrg, MAX(table_sum.summax) as msummax
FROM dohod2005 as B
LEFT JOIN (Select C.ID_D2005, SUM(C.summes) as summax FROM dohmes as C WHERE
koddoh=2000 GROUP BY C.ID_D2005) as table_sum ON B.ID_D2005=table_sum.ID_D2005
GROUP BY NameORG)
as t1
ON t.NameOrg = t1.NameOrg AND t.summax = t1.msummax ORDER BY t.NameOrg;
Неактивен