Имя: Пароль:
1C
1С v8
Группировка с условием в запросе
0 dredd_semsk
 
07.10.22
13:50
Добрый день, всем! Подскажите плж как можно решить след задачу:

КоличествоSellOut    _SUFactor    _Штрихкод    _ДатаАктивации
2                    0,0556            3014260104757    01.10.2019 0:00:00
2                    0,0555            3014260104757    01.08.2021 0:00:00
1                    0,0655            3014260104757    01.04.2021 0:00:00

Как можно сгруппировать строки так, чтобы _SUFactor суммировался по самой свежей датой активаций? т.е. 0,555+0,555+0,555(так как у 0,555 самая свежая дата активации, остальные значения заменяются ею )
1 Asmody
 
07.10.22
13:54
МАКСИМУМ(_ДатаАктивации) - это что ли?
2 PR
 
07.10.22
13:55
(0) Левое соединение с таблицей, сгруппированной по максимальному значению
Только нужно учесть, что максимальных значений может быть > 1
3 Garykom
 
гуру
07.10.22
14:06
(0) Добавить и заполнить колонку-поле для группировки
4 Garykom
 
гуру
07.10.22
14:06
(2) а соединять по чему будешь?
5 dredd_semsk
 
07.10.22
14:10
(4) по штрихкоду
6 Йохохо
 
07.10.22
14:14
сумма(суфактор), максиму(шк)
7 Йохохо
 
07.10.22
14:14
_датаактивации
8 lite777
 
07.10.22
14:17
МАКСИМУМ(_ДатаАктивации) * КоличеситвоЗаписейВТабл
9 lite777
 
07.10.22
14:19
Выбрать первые 1
МАКСИМУМ(_ДатаАктивации)

SUFactor*КолЗаписей
10 dredd_semsk
 
07.10.22
14:19
(7) в твоем варианте, он же просто суммирует суфактор, т.е. 0,0556+0,0555+0,0655 а надо чтобы 0,0555+0,0555+0,0555
11 dredd_semsk
 
07.10.22
14:19
(9) интересный вариант, вечером попробую и отпишусь
12 Garykom
 
гуру
07.10.22
14:58
два подзапроса в итоге и соединить их
13 Said_We
 
07.10.22
17:18
(0) Если не 1С, то можно добавить колонку с самой свежей датой в разрезе штрих кода, а потом из неё сумму посчитать. В итоге будет для каждой строки и текущая _SUFactor и необходимая сумма по всем строкам, но в каждой строке.
Примерно так:

SELECT
    t.КоличествоSellOut,
    t._SUFactor,
    t._Штрихкод,
    t._ДатаАктивации,
    t.new_SUFactor,
    sum(t.new_SUFactor) over(partition by t._Штрихкод) as SUM_new_SUFactor
from
    (SELECT
        t1.КоличествоSellOut,
        t1._SUFactor,
        t1._Штрихкод,
        t1._ДатаАктивации,
        (select top 1
            t2._SUFactor
        from
            ИмяТаблицы as t2
        where
            t1._Штрихкод = t2._Штрихкод
        order by
            t2._ДатаАктивации desc
        ) as new_SUFactor
    from
        ИмяТаблицы as t1) as t
14 Said_We
 
07.10.22
17:30
К (13)
new_SUFactor - это значение самой свежего значения (определяется по _ДатаАктивации) поля _SUFactor в разрезе штрих кода поле _Штрихкод.
SUM_new_SUFactor  - это сумма всех значений нового поля new_SUFactor в разрезе штрихкода.

В итоге получим примерно такую таблицу:

КоличествоSellOut    _SUFactor    _Штрихкод    _ДатаАктивации             new_SUFactor            SUM_new_SUFactor
2                          0,0556            3014260104757    01.10.2019 0:00:00     0,0555       0,1665
2                          0,0555            3014260104757    01.08.2021 0:00:00     0,0555       0,1665
1                          0,0655            3014260104757    01.04.2021 0:00:00     0,0555       0,1665
15 Said_We
 
07.10.22
18:05
(0) Если же 1С, то алгоритм примерно следующий:
1. Получить таблицу для каждого штрихкода с максимальной датой и прицепить её по штрих коду к исходной таблице.
2. К таблице полученной на первом этапе прицепить значение _SUFactor из исходной таблицы и назвать его как new_SUFactor по штрих коду и дате.
3. Из таблицы, полученной на третьем этапе получить таблицу с штрих кодом и суммой колонки new_SUFactor. Это либо то что нужно (итоговый результат же не показан в (0)), либо перейти к 4-му этапу.
4. Прицепить к таблице, полученной на втором этапе таблицу, полученную на третьем этапе по штрих коду.
16 Said_We
 
08.10.22
01:13
(11) вечер пятница... попробую... да да :-)
17 Said_We
 
09.10.22
16:13
(0) Итоговую таблицу нарисуй, которую получить необходимо.
18 Said_We
 
09.10.22
18:17
К (15) В общем если в 1С, то задача сведется либо к куче подзапросов к одной и той же таблице или куча временных таблиц на основе одной и той же исходной таблицы.
И тот и тот вариант получится мало читаемый код. С временными таблицами более читабельный, но если исходная таблица на десяток миллионов записей, то ресурсы будут жраться огромными порциями.

Как говориться выбирай из двух плохих вариантов.
19 Said_We
 
10.10.22
16:44
(0) Вопрос снят?
20 dredd_semsk
 
11.10.22
06:49
(19) ничего себе, какое развернутое решение. Сегодня приступаю - отпишусь!
21 dredd_semsk
 
11.10.22
06:49
(16) ))))
22 dredd_semsk
 
11.10.22
06:50
(18) не миллионы, но сотни тысяч
23 Said_We
 
11.10.22
10:17
(22) Хоть напиши 1С это или нет. Названия колонок на смешанном языке.
Нарисуй какая таблица должна быть на выходе.
24 mistеr
 
11.10.22
10:33
(0) 1. Группируем, находим последнюю дату и количество строк.
2. Соединяем с исходной таблицей, находим строку(и) с последней датой, считаем.
25 dredd_semsk
 
11.10.22
11:10
(23) 1c
26 dredd_semsk
 
11.10.22
11:11
(23)
КоличествоSellOut    _SUFactor    _Штрихкод    _ДатаАктивации
5                    0,0555            3014260104757    01.08.2021 0:00:00
27 dredd_semsk
 
11.10.22
11:13
(26) Поправка
КоличествоSellOut    _SUFactor    _Штрихкод    _ДатаАктивации
5                               0,1665            3014260104757    01.08.2021 0:00:00
28 dredd_semsk
 
13.10.22
14:25
(23)
ВЫБРАТЬ
    Номенклатура._Штрихкод КАК _Штрихкод,
    МАКСИМУМ(ВЫБОР
            КОГДА Номенклатура._ДатаАктивации = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
                ТОГДА ДАТАВРЕМЯ(2015, 2, 28, 23, 59, 59)
            ИНАЧЕ Номенклатура._ДатаАктивации
        КОНЕЦ) КАК _ДатаАктивации,
    СУММА(1) КАК КолЗаписей
ПОМЕСТИТЬ ВТ
ИЗ
    Справочник.Номенклатура КАК Номенклатура
ГДЕ
    Номенклатура._Штрихкод = &_Штрихкод

СГРУППИРОВАТЬ ПО
    Номенклатура._Штрихкод
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ._Штрихкод КАК _Штрихкод,
    ВТ._ДатаАктивации КАК _ДатаАктивации,
    ВТ.КолЗаписей КАК КолЗаписей,
    ВТ.КолЗаписей * Номенклатура._SUFactor КАК СуммаСУфакторов
ИЗ
    Справочник.Номенклатура КАК Номенклатура
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
        ПО (ВТ._ДатаАктивации = Номенклатура._ДатаАктивации)
            И (ВТ._Штрихкод = Номенклатура._Штрихкод)
29 dredd_semsk
 
13.10.22
14:26
как-то так. Всем спасибо за советы!)
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.