![]() |
![]() |
![]() |
|
Как найти максимально число по одному из параметров | ☑ | ||
---|---|---|---|---|
0
misha122062
06.03.09
✎
09:52
|
Прошу совета как такое можно сделать.
Задача: Найти максимально число людей на должности по подразделению. Т.е. Подразд ! Должность ! Организ ! Сотрудников ! --------------------------------------------- подраз1 ! должност1 ! Организ1! 5 подраз1 ! должност1 ! Организ2! 1 подраз1 ! должност1 ! Организ3! 10 подраз2 ! должност2 ! Организ1! 4 подраз2 ! должност2 ! Организ2! 5 подраз2 ! должност2 ! Организ3! 12 ....... На выходе подраз1 ! должност1 ! 10 подраз2 ! должност2 ! 12 ...... Просто функция МАКСИМУМ здесь не тянет. Кто подскажет по какому пути идти? |
|||
1
НЕА123
06.03.09
✎
09:53
|
СУММА()
? |
|||
2
misha122062
06.03.09
✎
09:55
|
(1)Причем же тут сумма. Надо одно, максимальное значение из Организаций
|
|||
3
Rie
06.03.09
✎
09:56
|
(0) А почему МАКСИМУМ не тянет?
|
|||
4
Kerk
06.03.09
✎
09:57
|
Группировку в запросе делай по нужным полям.
|
|||
5
misha122062
06.03.09
✎
09:58
|
(3)потому что будет Максимум из всего поля Количества, а мне надо из этого поля, но из Организации по подразделению и должности, т.е. последние 2 параметра как бы фильтр
|
|||
6
НЕА123
06.03.09
✎
10:00
|
(2)
из (0) я понял что сумма(). т.к. максимум не подходит. типа как в анекдоте "... - Не нравится зеленая ленточка? Заебеньте красную!" |
|||
7
iomoe
06.03.09
✎
10:00
|
select top 1 Подразд,Должность,sum(Сотрудников)
from Таблица group by Подразд,Должность order by sum(Сотрудников) desc |
|||
8
73
06.03.09
✎
10:01
|
(0) А Максимум из Максимума?
|
|||
9
misha122062
06.03.09
✎
10:01
|
(7) Это похоже, спасибо попробую
|
|||
10
Sadovnikov
06.03.09
✎
10:03
|
Create Table #Z (Подразделение Char(20), Должность Char(20), Количество Int)
Insert Into #Z Values ('Подразделение1', 'Должность1', 1) Insert Into #Z Values ('Подразделение1', 'Должность1', 100) Insert Into #Z Values ('Подразделение1', 'Должность2', 2) Insert Into #Z Values ('Подразделение1', 'Должность3', 3) Insert Into #Z Values ('Подразделение1', 'Должность3', 45) Insert Into #Z Values ('Подразделение1', 'Должность4', 4) Insert Into #Z Values ('Подразделение2', 'Должность1', 5) Insert Into #Z Values ('Подразделение2', 'Должность2', 6) Insert Into #Z Values ('Подразделение2', 'Должность3', 7) Insert Into #Z Values ('Подразделение2', 'Должность3', 72) Insert Into #Z Values ('Подразделение2', 'Должность4', 8) Insert Into #Z Values ('Подразделение3', 'Должность1', 9) Insert Into #Z Values ('Подразделение3', 'Должность2', 10) Insert Into #Z Values ('Подразделение3', 'Должность2', 10) Insert Into #Z Values ('Подразделение3', 'Должность3', 11) Select Таблица.Подразделение, Таблица.Должность, Таблица.Количество From ( Select Подразделение, MAX(Количество) Количество From #Z Group By Подразделение ) МаксКоличества Left Join #Z Таблица On Таблица.Подразделение = МаксКоличества.Подразделение And Таблица.Количество = МаксКоличества.Количество Drop Table #Z |
|||
11
misha122062
06.03.09
✎
10:04
|
(10) не понял, а зачем внешняя таблица
|
|||
12
Sadovnikov
06.03.09
✎
10:05
|
(11) Ну так надо было же на чем-то тренироваться.
|
|||
13
Sadovnikov
06.03.09
✎
10:06
|
+(12) Тоесть, это тот набор данных, который приведен в (0):
Подразд ! Должность ! Организ ! Сотрудников ! --------------------------------------------- подраз1 ! должност1 ! Организ1! 5 подраз1 ! должност1 ! Организ2! 1 |
|||
14
misha122062
06.03.09
✎
10:08
|
(13)спасибо
Тока поясните физический смысл, что то не въеду как работает. Почему берется Select Подразделение, MAX(Количество) Количество From #Z И здесь не учавствует Должность? |
|||
15
Sadovnikov
06.03.09
✎
10:08
|
(14) Потому что мы в итоге должность ищем при помощи связывания.
|
|||
16
Sadovnikov
06.03.09
✎
10:10
|
+(15) Тоесть, сначала ищем максивальное количество сотрудников на одной должности внутри каждого подразделения, а потом смотрим что это за должность.
Естественно, если внутри одного подразделения 2 должности с максимальным количество сотрудников - строки задвоятся. |
|||
17
misha122062
06.03.09
✎
10:14
|
Все равно туго доходит, уж простите.
А разве как в (7) не проще. И опять не понял, почему же нельзя указать Должность во вложенном запросе. |
|||
18
Sadovnikov
06.03.09
✎
10:16
|
(17) В (7) проще. Только работать не будет.
|
|||
19
iomoe
06.03.09
✎
10:19
|
(18) Поясни почему. В (0) две разные постановки задачи: нарисовано одно, написано другое. Для нарисованного подходит:
select Подразд,Должность,sum(Сотрудников) from Таблица group by Подразд,Должность для написанного: select top 1 Подразд,Должность,sum(Сотрудников) from Таблица group by Подразд,Должность order by sum(Сотрудников) desc |
|||
20
Sadovnikov
06.03.09
✎
10:20
|
Кстати, обраил внимание, что у меня входной набор данных неверный для такого запроса... Надо дублирующие по Подразделение+Должность строки из него убрать.
Или запрос переделать так, чтобы источником данных для него был подзапрос Select Таблица.Подразделение, Таблица.Должность, SUM(Таблица.Количество) From #Z Таблица Group By Подразделение, Должность |
|||
21
Sadovnikov
06.03.09
✎
10:21
|
(19) Не вижу в (0) расхождение с нарисованным и написанным...
"Найти максимально число людей на должности по подразделению" |
|||
22
misha122062
06.03.09
✎
10:22
|
(21)все верно А почему нет послее #Z слова КАК
Left Join #Z Таблица On Таблица.Подразделение = МаксКоличества.Подразделение And Таблица.Количество = МаксКоличества.Количество |
|||
23
misha122062
06.03.09
✎
10:23
|
блин, не то про КАК
|
|||
24
misha122062
06.03.09
✎
10:25
|
(26)Дублирующих строк не будет
|
|||
25
misha122062
06.03.09
✎
10:26
|
(19) что то не то SUM то при чем здесь
|
|||
26
Sadovnikov
06.03.09
✎
10:26
|
(19) Кстати, запрос, начинающийся с
select top 1 вернет одну строчку. Что вообще не подходит ни под один вариант, описанный в (19). И очень странной в таком запросе смотрится строка order by sum(Сотрудников) desc |
|||
27
misha122062
06.03.09
✎
10:30
|
(26)Поя поясни, плиз поподробнее - туплю, но почему же поля должности нет?
Ведь оно тоже нужно в запросе, мы тока берем максимум из организаций Select Подразделение, MAX(Количество) Количество From #Z Group By Подразделение И почему в левом соединении делаем cdpre по количеству, а не по подразделение AND Должность |
|||
28
misha122062
06.03.09
✎
10:30
|
И почему в левом соединении делаем связку по количеству, а не по подразделение AND Должность
|
|||
29
misha122062
06.03.09
✎
10:32
|
Кроме того в вышестоящем запросе идет поле Должность
ВЫБРАТЬ Таблица.Подразделение, Таблица.Должность, Таблица.Количество ИЗ А в нижестоящем - нет |
|||
30
Sadovnikov
06.03.09
✎
10:37
|
(27) Слушай, даже не знаю, как это объяснить... Поробую еще раз.
Нам сначала надо найти максимальное количество сотрудников на одной (пока неизвестной должности) внутри одного предприятия. Именно по этому мы и пишем: Select Подразделение, MAX(Количество) Количество From #Z Group By Подразделение А уже потом начинаем выяснять - что же это за должность? При этом мы имеем предприятие и количество. Именно по этим полям и проводим связывание. И берем из таблицы найденную должность. |
|||
31
misha122062
06.03.09
✎
10:39
|
получается, что этот запрос вернет макимум по подразделению, не важно какая должность?
|
|||
32
Sadovnikov
06.03.09
✎
10:40
|
(31) Вложенный - да.
|
|||
33
Sadovnikov
06.03.09
✎
10:40
|
(31) В жизни же тоже так - ты сначала поищешь какая максимальная цифирька в количестве, а потом будешь смотреть что это за должность.
|
|||
35
misha122062
06.03.09
✎
10:45
|
вопросы остались.
У меня в качестве таблицы #Z идет Запрос, как это повлияет? И второе - получается ты таблице связываешь с собой же (#Z Таблица) по совпадению подразделения и количества |
|||
36
misha122062
06.03.09
✎
10:46
|
(34) а это к чему - запутать?
|
|||
37
Sadovnikov
06.03.09
✎
10:50
|
(35) "таблице связываешь с собой же " и "в качестве таблицы #Z идет Запрос" - дабы запрос не выполнялся 2 раза - скинь его результаты во временную таблицу. А ее уже скорми запросу из (10).
(36) Не обращай внимания - дятел развлекается. |
|||
38
misha122062
06.03.09
✎
10:58
|
(37) Это идея, но никак не пойму, почему же во внутреннем нет должности.
Ведь соединение будет идти по подразделению и количеству. А если во внутрнним будет Склад, кладовщиков,5 Склад, грузчиков, 5 Как они свжуться? Количество то одинаковое |
|||
39
Sadovnikov
06.03.09
✎
11:01
|
(38) "Как они свжуться? Количество то одинаковое" - Именно по этому я писал в (16): "Естественно, если внутри одного подразделения 2 должности с максимальным количество сотрудников - строки задвоятся."
|
|||
41
Nikrub
06.03.09
✎
11:09
|
(0)
ВЫБРАТЬ Табл.Подразделение, Табл.Должность, МАКСИМУМ(Табл.Количество) КАК Количество ИЗ Табл КАК Табл СГРУППИРОВАТЬ ПО Табл.Подразделение, Табл.Должность |
|||
42
Sadovnikov
06.03.09
✎
11:09
|
(41) А теперь попробуй свой код. :))
|
|||
43
misha122062
06.03.09
✎
11:10
|
(41) у меня тоже сначала такая мысль была
|
|||
44
Nikrub
06.03.09
✎
11:11
|
(42) надо передать вирт. таблицу в запрос сперва конечно
(43) почему нет? |
|||
45
misha122062
06.03.09
✎
11:12
|
(39)Так что бы исключить задвоения как поступить?
А то ведь связка будет бред. (44) ну... не знаю... попробую через виртуальную |
|||
46
Nikrub
06.03.09
✎
11:14
|
(45) мне кажется, задача простая, просто "глаз замылен" ;)
|
|||
47
misha122062
06.03.09
✎
11:19
|
да вот чую на поверхности, но когда куча всяких запросов и задач. Простые задачи так не реются
|
|||
48
Sadovnikov
06.03.09
✎
11:22
|
(44) Не правильный у тебя запрос. Попробуй его - сразу увидишь.
(45) Избежать задвоений можно. Тебе же без разницы при этом какую должность взять верно? Ведь они обе с одинаковым количеством. Сделать это можно так: Select Выборка.Подразделение Подразделение, Max(Выборка.Должность) Должность, Выборка.Количество Количество From ( Select Таблица.Подразделение Подразделение, Таблица.Должность Должность, Таблица.Количество Количество From ( Select Подразделение, MAX(Количество) Количество From #Z Group By Подразделение ) МаксКоличества Left Join #Z Таблица On Таблица.Подразделение = МаксКоличества.Подразделение And Таблица.Количество = МаксКоличества.Количество ) Выборка Group By Выборка.Подразделение, Выборка.Количество |
|||
49
Новичок
06.03.09
✎
11:25
|
Сравнил развертывание 8 и 7.7, на предмет во сколько это станет для кумпании (маленькой, сотрудников не больше 200)... так вот затраты на железо для 8 раза в 2 выше чем для 7.7...
Правда 8 выигрывает в цене ежели ставить на серваки Линух и Постгрис Но если учет в фирме отличается от стандартной конфы... или надо что то дописать, то ну её нах эту 8... она же наворочена сверх всякой меры... Писал обработку переноса данных из СуперМага в 8 Бухию... 3 дня угробил разбираясь как работает ПКО... и в таком же стиле написаны все стандартные и нестандартные конфы... Это ж тихий ужас... Не, я может быть чего то не понимаю... страюсь правда... но никак не доходит, может кто то объяснит, зачем надо было так громоздить структуру? |
|||
50
misha122062
06.03.09
✎
11:26
|
(48)Как это без раздницы!
Надо и то и то - обе взять, т.к. хоть подразделение и количество одинаковое, должности то разные |
|||
51
73
06.03.09
✎
11:27
|
(50) Так определитесь: задвоение - это и значит взять обе.
|
|||
52
Serg_1960
06.03.09
✎
11:29
|
Не читал всё - только (0) - лениво :(
ВЫБРАТЬ Табл.Подразделение, Табл.Должность, МАКСИМУМ(Табл.Количество) КАК Количество ИЗ ( ВЫБРАТЬ Табл.Организация, Табл.Подразделение, Табл.Должность, СУММА(Табл.Количество) КАК Количество ИЗ Табл КАК Табл СГРУППИРОВАТЬ ПО Табл.Организация, Табл.Подразделение, Табл.Должность)... |
|||
53
Sadovnikov
06.03.09
✎
11:32
|
(52) Еще один... Перед тем, как выкладывать код стоило бы проверить его работоспособность...
|
|||
54
misha122062
06.03.09
✎
11:33
|
(51)Нету задвоения.
Подразд ! Должность ! Организ ! Сотрудников ! --------------------------------------------- подраз1 ! должност1 ! Организ1! 5 подраз1 ! должност1 ! Организ2! 1 подраз1 ! должност1 ! Организ3! 10 подраз2 ! должност2 ! Организ1! 4 подраз2 ! должност2 ! Организ2! 5 подраз2 ! должност2 ! Организ3! 12 ....... На выходе подраз1 ! должност1 ! 10 подраз2 ! должност2 ! 12 ...... Задвоение будет во внутреннем запросе, как выше описано. А если Склад, кладовщиков,5 Склад, грузчиков, 5 то беру обе - где здесь задвоение? |
|||
55
Sadovnikov
06.03.09
✎
11:36
|
(54) Задвоение: ДВЕ должности внутри одного подразделения. Вот это я имел ввиду.
|
|||
56
73
06.03.09
✎
11:36
|
(54) Это и имеется ввиду. Задвоение - при связывании по количеству вернут обе должности
|
|||
57
73
06.03.09
✎
11:38
|
(56)+ Попробуй на реальных данных.
|
|||
58
misha122062
06.03.09
✎
11:43
|
короче спасибо, буду пробовать.
|
|||
59
Sadovnikov
06.03.09
✎
11:49
|
(58) Удачи :)
|
|||
60
Nikrub
06.03.09
✎
11:50
|
(59) а что не срастается в (52)?
|
|||
61
misha122062
06.03.09
✎
11:52
|
Рабочая версия :)
ЗапросКолДол2 = Новый Запрос(); ЗапросКолДол2.МенеджерВременныхТаблиц=МенеджерВременныхТаблиц1; ЗапросКолДол2.УстановитьПараметр("СписокХозяйств", СписокХозяйств); ЗапросКолДол2.Текст = " |ВЫБРАТЬ Подразделение, Должность, |МАКСИМУМ (Количество) |ИЗ ( |ВЫБРАТЬ | Подразделение, Должность, Организация, | СУММА(Количество) КАК Количество |ИЗ ( | ВЫБРАТЬ | Организация, Должность, Подразделение, | 1 КАК Количество | ИЗ ВременнаяТабл | ГДЕ Организация В(&СписокХозяйств) | ) КАК ВложенныйЗапрос |СГРУППИРОВАТЬ ПО Подразделение, Должность,Организация | ) КАК ВложенныйЗапрос2 |СГРУППИРОВАТЬ ПО Подразделение, Должность |УПОРЯДОЧИТЬ ПО Подразделение, Должность |"; ТЗ_Запроса3 = ЗапросКолДол2.Выполнить().Выгрузить(); ПросмотрТЗВнеш(ТЗ_Запроса3,"ТЗ_Запроса3"); |
|||
62
Sadovnikov
06.03.09
✎
11:54
|
(61) Что это, Бэримор??
(60) Не получишь того, что требуется автору: "Найти максимально число людей на должности по подразделению" |
|||
63
misha122062
06.03.09
✎
11:55
|
Рбочая врсия. проверена но 12 оргаизациях с людьми - трактористы, грузчики машенисты и проч..
Зато како вышел пост. |
|||
64
Sadovnikov
06.03.09
✎
11:56
|
(63) Пипец...
|
|||
65
Sadovnikov
06.03.09
✎
11:57
|
(63) Ты сам-то понимаешь, что ты запросом из (61) посчитал?
|
|||
66
Nikrub
06.03.09
✎
11:59
|
(65) человек нашел решение. что тебе от него еще надо? )))
|
|||
67
Sadovnikov
06.03.09
✎
12:00
|
(66) Тоже верно :)
|
|||
68
73
06.03.09
✎
12:03
|
(63) А чего ж в (0) <максимум не тянет>? Издеваешься?
|
|||
69
Sadovnikov
06.03.09
✎
12:05
|
(68) Глянь (66)
:) |
|||
70
73
06.03.09
✎
12:06
|
(68)+ и так и не определишь в какой же это организации случилось (63)
|
|||
71
misha122062
06.03.09
✎
12:07
|
была ошибка. я потом ее нашел - использовал еще один вложенный запрос.
|
|||
72
Sadovnikov
06.03.09
✎
12:08
|
(71) Ну засвети тогда конечный вариант.
|
|||
73
misha122062
06.03.09
✎
12:12
|
Просто была маленькая ошибка, использовал еще один внутренний запрос и пошло.
(70)А это и не надо! Надо Итогами по подразделению |
|||
74
misha122062
06.03.09
✎
12:12
|
(72) так он в (61)
|
|||
75
73
06.03.09
✎
12:15
|
(74) Вывод: Когда Максимум не тянет - запости > 70
|
|||
76
Sadovnikov
06.03.09
✎
12:15
|
(74) ОЧЕНЬ внимательно посмотри на свой запрос и попытайся понять что он делает...
|
|||
77
Nikrub
06.03.09
✎
12:20
|
))))
|
|||
78
Nikrub
06.03.09
✎
12:21
|
+(77) кто кого, интересно?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |