Имя: Пароль:
1C
1С v8
Как в запросе выбрать наиболее часто повторяющиеся значения?
,
0 Jackman
 
24.12.13
20:11
Попросили аналитики написать простенький настраиваемый отчет, который показывал: сколько раз и какие давались скидки в РН. Нацарапал и отдал:


ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура,
РеализацияТоваровУслугТовары.Ссылка,
ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.ОбщийПроцентСкидкиНаценки КАК ЧИСЛО(10, 0)) КАК Скидка,
1 КАК Колво
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
    И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалаПериода И &КонецПериода



Только что попросили чтобы этот отчет выводил только те скидки в разрезе номенклатуры и контрагентов, которые повторяются максимальное кол-во раз. Т.е. ЧП Иванов покупал 10 раз карандаш по со скидкой 5% и 8 раз со скидкой 15%, отчет должен выводить скидку 5%.

Что-то в голову сразу решение не приходит, отчет должне быть на СКД.
1 SherifSP
 
24.12.13
20:15
(1) В запросе выбрать первые 1 и сортировка по убыванию по полю Колво
2 andr_andrey
 
24.12.13
20:15
(0) 1) ВТ - посчитать наиболее часто встречающуюся скидку.
2) Сформировать отчет с скидкой из 1)
3 SherifSP
 
24.12.13
20:18
Ну а в скд на группировке, сортировку по полю колво сделай думаю все получится
4 Jackman
 
24.12.13
20:46
Сорри, отвлекали, сейчас попробую
5 Jackman
 
24.12.13
20:55
(1) Выбрать первые 1 выведет только одну запись из всего запроса или я туплю?
6 Banned
 
24.12.13
21:03
(5) выбери 5, в чём проблема?
7 Jackman
 
24.12.13
21:14
(6) Если мы говорим об одном и том же, то запрос, типа:

ВЫБРАТЬ ПЕРВЫЕ 1
    РеализацияТоваровУслугТовары.Ссылка.Контрагент,
    РеализацияТоваровУслугТовары.Номенклатура,
    ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.ОбщийПроцентСкидкиНаценки КАК ЧИСЛО(10, 0)) КАК Скидка,
    СУММА(1) КАК Колво
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
    И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалаПериода И &КонецПериода

СГРУППИРОВАТЬ ПО
    РеализацияТоваровУслугТовары.Ссылка.Контрагент,
    РеализацияТоваровУслугТовары.Номенклатура,
    ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.ОбщийПроцентСкидкиНаценки КАК ЧИСЛО(10, 0))

УПОРЯДОЧИТЬ ПО
    Колво УБЫВ


Выведет всего только одну запись, а мне нужно для каждого товара и контрагента.
8 Jackman
 
24.12.13
21:15
+ т.е. результатом запроса всегда будет одна запись
9 МишКа
 
24.12.13
21:25
(7) Тебе надо:
1. Выбрать все записи, а не одну.
2. Сохранить это, как ВТ1.
3. Сгруппировать ВТ1 (агрегатная функция МАКСИМУМ(колво)) и сохранить как ВТ2.
4. Соединить ВТ1 и ВТ2.

И к чему это СУММА(1)?
Чем агрегатная функция КОЛИЧЕСТВО() не устраивает?
10 Jackman
 
24.12.13
21:48
Т.е, что-то типа этого?



ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
    ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.ОбщийПроцентСкидкиНаценки КАК ЧИСЛО(10, 0)) КАК Скидка,
    СУММА(1) КАК Колво
ПОМЕСТИТЬ ТЗ
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
    И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалаПериода И &КонецПериода

СГРУППИРОВАТЬ ПО
    РеализацияТоваровУслугТовары.Ссылка.Контрагент,
    РеализацияТоваровУслугТовары.Номенклатура,
    ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.ОбщийПроцентСкидкиНаценки КАК ЧИСЛО(10, 0))
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ИзТЗ.Контрагент,
    ИзТЗ.Номенклатура,
    МАКСИМУМ(ИзТЗ.Колво) КАК Колво
    ПОместить ТЗМаксКолво
ИЗ
    ТЗ КАК ИзТЗ

СГРУППИРОВАТЬ ПО
    ИзТЗ.Контрагент,
    ИзТЗ.Номенклатура,
    ИзТЗ.Скидка
;

////////////////////////////////////////////////////////////////////////////////
   ВЫБРАТЬ
    ТЗ.Контрагент,
    ТЗ.Номенклатура,
    ТЗ.Скидка,
    ТЗ.Колво    
ИЗ
    ТЗ КАК ТЗ    
    
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
  ТЗМаксКолво КАК ТЗМаксКолво  
   ПО ТЗ.Номенклатура = ТЗМаксКолво.Номенклатура  
   И ТЗ.Контрагент = ТЗМаксКолво.Контрагент
   и ТЗ.Колво = ТЗМаксКолво.Колво

11 Jackman
 
24.12.13
22:22
Что-то не так работает... Не так работает вторая ВТ, туда попадают все значения, максимальные и немаксимальные.


ВЫБРАТЬ
    ИзТЗ.Контрагент,
    ИзТЗ.Номенклатура,
    МАКСИМУМ(ИзТЗ.Колво) КАК Колво
    ПОместить ТЗМаксКолво
ИЗ
    ТЗ КАК ИзТЗ

СГРУППИРОВАТЬ ПО
    ИзТЗ.Контрагент,
    ИзТЗ.Номенклатура,
    ИзТЗ.Скидка
;

12 Jackman
 
24.12.13
22:28
Понял, ИзТЗ.Скидка в группировке лишняя...
13 Jackman
 
24.12.13
22:39
Еще один момент, если клиент покупал товар всего два раза и с двумя скидками, в этом случае вываливается две скидки, т.к. количества одинаковы. Как в этом случае брать большую?
14 Jackman
 
24.12.13
22:42
Кажется понял, получать из последнего запроса Максимум по скидке
15 Jackman
 
24.12.13
22:53
Вообщем, всем спасибо, вот окончательный запрос, в нем, вместо Номенклатуры использую реквизит "Номенклатурная группа", но суть не меняется:


ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
    РеализацияТоваровУслугТовары.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа,
    ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.ОбщийПроцентСкидкиНаценки КАК ЧИСЛО(10, 0)) КАК Скидка,
    Количество(ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.ОбщийПроцентСкидкиНаценки КАК ЧИСЛО(10, 0))) КАК Колво
ПОМЕСТИТЬ ТЗ
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Проведен = ИСТИНА
    И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалаПериода И &КонецПериода

СГРУППИРОВАТЬ ПО
    РеализацияТоваровУслугТовары.Ссылка.Контрагент,
    РеализацияТоваровУслугТовары.Номенклатура.НоменклатурнаяГруппа,
    ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.ОбщийПроцентСкидкиНаценки КАК ЧИСЛО(10, 0))
;

///////////////////////
ВЫБРАТЬ
    ИзТЗ.Контрагент,
    ИзТЗ.НоменклатурнаяГруппа,
    МАКСИМУМ(ИзТЗ.Колво) КАК Колво
ПОМЕСТИТЬ ТЗМаксКолво
ИЗ
    ТЗ КАК ИзТЗ

СГРУППИРОВАТЬ ПО
    ИзТЗ.Контрагент,
    ИзТЗ.НоменклатурнаяГруппа
;

////////////////////
ВЫБРАТЬ
    ТЗМаксКолво.Контрагент,
    ТЗМаксКолво.НоменклатурнаяГруппа,
    МАКСИМУМ(ТЗ.Скидка) как Скидка,
    ТЗМаксКолво.Колво
ИЗ
    ТЗМаксКолво КАК ТЗМаксКолво
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ
        ПО (ТЗМаксКолво.Контрагент = ТЗ.Контрагент
                И ТЗМаксКолво.НоменклатурнаяГруппа = ТЗ.НоменклатурнаяГруппа
                И ТЗМаксКолво.Колво = ТЗ.Колво)
    СГРУППИРОВАТЬ ПО
    ТЗМаксКолво.Контрагент,
    ТЗМаксКолво.НоменклатурнаяГруппа,
    ТЗМаксКолво.Колво
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.