Имя: Пароль:
1C
1С v8
v8: Хитрый запрос - как правильно отсечь ненужные записи?
,
0 dave2000
 
09.07.13
21:41
Помогите плиз, голова совсем уже не работает.
Есть две таблички:

1) табПолки
Полка          Товар
-------------------------------------
Полка1         Яблоки
Полка2         Груши
Полка3         Персики

2) табЦены
Товар       Код         Цена
--------------------------------------------------------------
Яблоки      3           20.00
Яблоки      1           22.00
Яблоки      2           17.00
Груши       4           18.00
Груши       5           15.00
Груши       6           17.00
Персики     8           21.00
Персики     7           23.00
Персики     9           22.00

Нужно расставить на каждую полку товар с кодом, имеющим максимальную цену, т.е. получить такую результирующую таблицу:

3) табТовар
Полка          Товар       Код         Цена
-----------------------------------------------
Полка1         Яблоки       1          22.00
Полка2         Груши        4          18.00
Полка3         Персики      7          23.00


Получается, нужно как-то отсечь из второй таблицы товары с наименьшими ценами (оставить только максимальные) и левым соединением прицепить её к полкам. Как правильно отсечь минимальные цены - ума не приложу. У кого какие мысли будут?
1 PR
 
09.07.13
21:48
Выбрать первую таблицу, сгруппировать по товару и максимуму цены, выбрать вторую с левым соединением первой по товару.
2 Славен
 
09.07.13
21:49
это хитрый запрос?
3 SeregaMW
 
09.07.13
21:53
Ну что содержание ветки соответствовало названию покритикуйте мой запрос, думаю как сделать более элегантно.

       
 ВЫБРАТЬ
   ВложенныйЗапрос.ОС,
   ВложенныйЗапрос.ГруппаОС КАК ГруппаОС,
   ВложенныйЗапрос.Местонахождение как Подразделение,
   ВложенныйЗапрос.СуммаНачальныйОстатокДт,
   ВложенныйЗапрос1.Состояние
ИЗ
   (ВЫБРАТЬ ПЕРВЫЕ 10
       ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
       ВЫРАЗИТЬ(ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Справочник.ОсновныеСредства) КАК ОС,
       ВЫРАЗИТЬ(ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Справочник.ОсновныеСредства).ГруппаОС КАК ГруппаОС,
       МестонахождениеОСБухгалтерскийУчетСрезПоследних.Местонахождение КАК Местонахождение
   ИЗ
       РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНачала, , , , Счет В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОсновныеСредства)), , Организация = &Организация) КАК ХозрасчетныйОстаткиИОбороты
           ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестонахождениеОСБухгалтерскийУчет.СрезПоследних(&ДатаНачала, ) КАК МестонахождениеОСБухгалтерскийУчетСрезПоследних
           ПО ((ВЫРАЗИТЬ(ХозрасчетныйОстаткиИОбороты.Субконто1 КАК Справочник.ОсновныеСредства)) = МестонахождениеОСБухгалтерскийУчетСрезПоследних.ОсновноеСредство)) КАК ВложенныйЗапрос
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ВложенныйЗапрос5.ОсновноеСредство КАК ОсновноеСредство,
           ВЫБОР
               КОГДА ВложенныйЗапрос5.Состояние ЕСТЬ NULL
                   ТОГДА ВложенныйЗапрос5.Состояние1
               ИНАЧЕ ВложенныйЗапрос5.Состояние
           КОНЕЦ КАК Состояние
       ИЗ
           (ВЫБРАТЬ
               ВложенныйЗапрос4.ОсновноеСредство КАК ОсновноеСредство,
               ВЫБОР
                   КОГДА ВложенныйЗапрос4.Состояние2 ЕСТЬ NULL
                       ТОГДА ВложенныйЗапрос4.Состояние1
                   ИНАЧЕ ВложенныйЗапрос4.Состояние2
               КОНЕЦ КАК Состояние,
               ВЫБОР
                   КОГДА ВложенныйЗапрос4.Состояние2 ЕСТЬ NULL
                       ТОГДА ВложенныйЗапрос4.ДатаСостояния1
                   ИНАЧЕ ВложенныйЗапрос4.ДатаСостояния2
               КОНЕЦ КАК ДатаСостояния,
               ВложенныйЗапрос4.ДатаСостояния КАК ДатаСостояния1,
               ВложенныйЗапрос4.Состояние КАК Состояние1
           ИЗ
               (ВЫБРАТЬ
                   ВложенныйЗапрос.ОсновноеСредство КАК ОсновноеСредство,
                   ВложенныйЗапрос.ДатаСостояния КАК ДатаСостояния,
                   ВложенныйЗапрос.Состояние КАК Состояние,
                   ВложенныйЗапрос1.ДатаСостояния КАК ДатаСостояния1,
                   ВложенныйЗапрос1.Состояние КАК Состояние1,
                   ВложенныйЗапрос2.ДатаСостояния КАК ДатаСостояния2,
                   ВложенныйЗапрос2.Состояние КАК Состояние2
               ИЗ
                   (ВЫБРАТЬ
                       СостоянияОСОрганизаций.Состояние КАК Состояние,
                       СостоянияОСОрганизаций.ДатаСостояния КАК ДатаСостояния,
                       СостоянияОСОрганизаций.ОсновноеСредство КАК ОсновноеСредство
                   ИЗ
                       РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций
                   ГДЕ
                       СостоянияОСОрганизаций.ДатаСостояния <= &ДатаНачала
                       И СостоянияОСОрганизаций.Организация = &Организация
                       И СостоянияОСОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияОС.ПринятоКУчету)
                   
                   СГРУППИРОВАТЬ ПО
                       СостоянияОСОрганизаций.Состояние,
                       СостоянияОСОрганизаций.ДатаСостояния,
                       СостоянияОСОрганизаций.ОсновноеСредство) КАК ВложенныйЗапрос
                       ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                           СостоянияОСОрганизаций.Состояние КАК Состояние,
                           СостоянияОСОрганизаций.ДатаСостояния КАК ДатаСостояния,
                           СостоянияОСОрганизаций.ОсновноеСредство КАК ОсновноеСредство
                       ИЗ
                           РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций
                       ГДЕ
                           СостоянияОСОрганизаций.ДатаСостояния <= &ДатаНачала
                           И СостоянияОСОрганизаций.Организация = &Организация
                           И СостоянияОСОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияОС.ВведеноВЭксплуатацию)
                       
                       СГРУППИРОВАТЬ ПО
                           СостоянияОСОрганизаций.Состояние,
                           СостоянияОСОрганизаций.ДатаСостояния,
                           СостоянияОСОрганизаций.ОсновноеСредство) КАК ВложенныйЗапрос1
                       ПО ВложенныйЗапрос.ОсновноеСредство = ВложенныйЗапрос1.ОсновноеСредство
                       ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                           СостоянияОСОрганизаций.Состояние КАК Состояние,
                           СостоянияОСОрганизаций.ДатаСостояния КАК ДатаСостояния,
                           СостоянияОСОрганизаций.ОсновноеСредство КАК ОсновноеСредство
                       ИЗ
                           РегистрСведений.СостоянияОСОрганизаций КАК СостоянияОСОрганизаций
                       ГДЕ
                           СостоянияОСОрганизаций.ДатаСостояния <= &ДатаНачала
                           И СостоянияОСОрганизаций.Организация = &Организация
                           И СостоянияОСОрганизаций.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияОС.СнятоСУчета)
                       
                       СГРУППИРОВАТЬ ПО
                           СостоянияОСОрганизаций.Состояние,
                           СостоянияОСОрганизаций.ДатаСостояния,
                           СостоянияОСОрганизаций.ОсновноеСредство) КАК ВложенныйЗапрос2
                       ПО ВложенныйЗапрос.ОсновноеСредство = ВложенныйЗапрос2.ОсновноеСредство) КАК ВложенныйЗапрос4) КАК ВложенныйЗапрос5) КАК ВложенныйЗапрос1
       ПО ВложенныйЗапрос.ОС = ВложенныйЗапрос1.ОсновноеСредство
4 SeregaMW
 
09.07.13
21:54
(0) А ты отдай учетку у тебя 5 лет стажу!!! 8-0
5 dave2000
 
09.07.13
22:05
(1) > сгруппировать по товару и максимуму цены

Так бы и сделал, но как не потерять колонку "Код", которая не является полем товара?


ВЫБРАТЬ
 табЦены.Товар
 МАКСИМУМ(табЦены.Цена)
ИЗ
 табЦены КАК табЦены
СГРУППИРОВАТЬ ПО
 табЦены.Товар
6 dave2000
 
09.07.13
22:07
Если делать так, мы получим ту же вторую таблицу, не усеченную.

ВЫБРАТЬ
 табЦены.Товар,
 табЦены.Код,
 МАКСИМУМ(табЦены.Цена)
ИЗ
 табЦены КАК табЦены
СГРУППИРОВАТЬ ПО
 табЦены.Товар,
 табЦены.Код
7 dave2000
 
09.07.13
22:13
Из-за колонки "Код" мы не можем просто взять и сгруппировать таблицу. Для одного и того же товара, код может стоять разный.
8 SeregaMW
 
09.07.13
22:16
(0) И чего я сегодня такой добрый, а все от того что мне здесь тоже помогают ;-)

ВЫБРАТЬ
ТаблицаЦена.Товар,
ТаблицаЦена.Код,
МАКСИМУМ(ТаблицаЦена.Цена),
ТаблицаПолок.Полка
ИЗ
ТабЦена КАК ТаблицаЦена
ЛЕВОЕ СОЕДИНЕНИЕ ТабПолки КАК ТаблицаПолок
ПО ТабЦена.Товар = ТаблицаПолок.Товар
СГРУППИРОВАТЬ ПО
ТаблицаПолок.Полка,
ТаблицаЦена.Товар,
ТаблицаЦена.Код
9 SeregaMW
 
09.07.13
22:24
(8) Кто найдет ошибку? )))
10 dave2000
 
09.07.13
22:27
(8) По твоему примеру мы получим таблицу:

Товар       Код         Цена         Полка
--------------------------------------------------------------
Яблоки      3           20.00        Полка1
Яблоки      1           22.00        Полка1
Яблоки      2           17.00        Полка1
Груши       4           18.00        Полка2
Груши       5           15.00        Полка2
Груши       6           17.00        Полка2
Персики     8           21.00        Полка3
Персики     7           23.00        Полка3
Персики     9           22.00        Полка3

У нас ведь поле "Код" не группируется.
11 dave2000
 
09.07.13
22:45
У кого ещё какие варианты есть?
12 SeregaMW
 
09.07.13
22:48
(11) так попробуй

ВЫБРАТЬ
ТаблицаЦена.Товар,
ТаблицаЦена.Код,
ТаблицаЦена.Цена,
ТаблицаПолок.Полка
ИЗ
(ВЫБРАТЬ
МАКСИМУМ(ТаблицаЦена.Цена),
ТаблицаЦена.Товар,
ТаблицаЦена.Код
ИЗ
ТабЦена КАК ТаблицаЦена
СГРУППИРОВАТЬ ПО
ТаблицаЦена.Товар,
ТаблицаЦена.Код) КАК ВложенныйЗапрос

ЛЕВОЕ СОЕДИНЕНИЕ ТабПолки КАК ТаблицаПолок
ПО ВложенныйЗапрос.Товар = ТаблицаПолок.Товар
СГРУППИРОВАТЬ ПО
ТаблицаПолок.Полка,
ТаблицаЦена.Товар,
ТаблицаЦена.Код
13 SeregaMW
 
09.07.13
22:50
только еще поменяй на
ВЫБРАТЬ
ВложенныйЗапрос.Товар,
ВложенныйЗапрос.Код,
ВложенныйЗапрос.Цена,

СГРУППИРОВАТЬ ПО
ТаблицаПолок.Полка,
ВложенныйЗапрос.Товар,
ВложенныйЗапрос.Код
14 mistеr
 
09.07.13
22:57
(0) Нужно уточнить задачу. Что ставить на полку, если цена всех видов яблок одинаковая?

P.S. Мысли вслух: когда же в языке запросов появятся аналитические функции?..
15 dave2000
 
09.07.13
23:23
(14) Если цена одинаковая, на полку ставить только один, первый попавшийся товар.

(12) Это по сути такой же пример, как ты выше приводил, только модифицированный - вложенный запрос у нас не сгрупируется из-за уникального кода.
16 dave2000
 
09.07.13
23:28
Я так чувствую, запросом эту задачу не решить, нужно програмно обрабатывать.. эхх..
17 К_Дач
 
10.07.13
00:10
(16) да ладно. тебе уже Печенкин Рома все написал, ну почти. пакетным запросом:

1. Берешь свою ТабЦены. Группируешь по товару и максимуму цены, получаешь:

Яблоки 22.00
Груши 18.00
Персики 23.00

2. Берешь ТабЦены еще раз. К ней Слева приклеиваешь Таб1, условия Товар = Товар И Цена = Цена, выбрать только те записи, где код не есть Null

Яблоки       1          22.00
Груши        4          18.00
Персики      7          23.00

3. К полкам слева лепишь товары.

м?
18 dave2000
 
10.07.13
10:21
(17) на данном примере сработает, но это не совсем корректно, т.к. в случае одинаковой цены всё равно нужно будет отсекать лишние строки, оставлять только одну
19 Юный 1С
 
10.07.13
10:46
ну можешь потом еще раз сгруппировать итоговую таблицу Макс/Мин(Код) по Номенклатура,Цена,Полка
Макс или Мин - это как больше нравится
20 el-gamberro
 
10.07.13
10:49
(18) Пошутил что-ли?
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший