Запросы 1С (или SQL)

oksana45

подскажите как запросом получить следующую табличку.
таблица1 с днями
| 01 |
| 02 |
| 03 |
| 04 |
таблица2 остатков товаров
| 01| 10шт |
| 04| 20шт |
Как получить таблицу3:
| 01 | 10шт |
| 02 | 10шт |
| 03 | 10шт |
| 04 | 20шт |
надо получить именно запросом.

0000


select t1.a, max(b)
from t1
Left Join t2 On t1.a >= t2.a
group by t1.a
order by t1.a

?

oksana45

а разве получится не
| 01 | 20шт |
| 02 | 20шт |
| 03 | 20шт |
| 04 | 20шт | ?
реальные таблицы намного больше, это я для примера привел

0000

А разве проверить тяжело?
Если таблица2 не сильно разряжена, то мне кажется пойдет. Если сильно, то надо воспользоваться чем нить специфическим для конкретной БД. Поскольку у тебя скорее всего MS SQL, то через аналитику (Oracle) писать не стал.

oksana45

просто ты совсем какую-то фигню написал
зачем присоединять максимальное значение справа?

mbolik1


select t3.c1, t2.c2
from
(select t1.c1 as c1, max(t2.c1) as c2
from
t1
join t2 on (t2.c1 <= t1.c1)
group by t1.c1
) t3
join t2 on (t2.c1 = t3.c2)

А база какая? Потому что запрос тяжеловат, лучше пользоваться специальными функциями.

peter1dav

Если исходить из того что в 1С остатки не хранятся на каждый день (в общем случае а представлены в виде двух табличек: итоги (на начало и конец периода) + движения за период, то мб. запрос подобного вида? первое что в голову пришло
ЗЫ. 1С - версия 8.0, в 8.1 можно еще попробовать со временными таблицами поиграться. Иногда помогает
 
 
ВЫБРАТЬ
ТаблицаДат.Дата,
СУММА(ВЫБОР
КОГДА ТаблицаДат.Дата >= ЗапросПоОстаткам.Дата
ТОГДА ЗапросПоОстаткам.Количество
ИНАЧЕ 0
КОНЕЦ) КАК Количество
ИЗ
РегистрСведений.ТаблицаДат КАК ТаблицаДат
ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ОстаткиНаНачалоПериода.Дата КАК Дата,
ОстаткиНаНачалоПериода.КоличествоОстаток КАК Количество
ИЗ
РегистрНакопления.ОстаткиТовара.Остатки(&ДатаНачала, ) КАК ОстаткиНаНачалоПериода

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ОборотыЗаПериод.Дата,
СУММА(ОборотыЗаПериод.КоличествоОборот)
ИЗ
РегистрНакопления.ОстаткиТовара.Обороты(&ДатаНачала, &ДатаОкончания, , ) КАК ОборотыЗаПериод

СГРУППИРОВАТЬ ПО
ОборотыЗаПериод.Дата) КАК ЗапросПоОстаткам
ПО (ИСТИНА)

СГРУППИРОВАТЬ ПО
ТаблицаДат.Дата

0000

Какой настырный - ну елы-палы проверь на тестовых таблицах. Неужели это так долго?
Если совсем лень - можешь воспользоваться Oracle

select t1.a, max(b) from
(select 1 a from dual
union
select 2 a from dual
union
select 3 a from dual
union
select 4 a from dual
union
select 5 a from dual
union
select 6 a from dual
union
select 7 a from dual
union
select 8 a from dual) t1 Left Join
(select 1 a, 10 b from dual
union
select 4 a, 20 b from dual
union
select 7 a, 30 b from dual
) t2 On t1.a >= t2.a
group by t1.a
order by t1.a

oksana45

похоже на правду
большое спасибо!

zlz111

да, действительно, просто и вкусно =)

oksana45

на числе 8 имеем сумму: 10 + 20 +30
а надо просто 30
П.С. задачу решили, всем спасибо

0000

? Так у меня и выводится 30. Ладно, наверно что то я не так понял (при чем тут суммы какие то...).

oksana45

проверили на SQL2005
действительно твой запрос работает
а на нашем любимом 1с
надо писать так как максик написал
в любом случае, спасибо
но если в исходной задаче изменить 20 на 5, то функция мах делает все неправильно
Оставить комментарий
Имя или ник:
Комментарий: