Имя: Пароль:
1C
 
Как найти максимально число по одному из параметров
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) кто кого, интересно?
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.