Имя: Пароль:
1C
1C 7.7
v7: sql запрос.
,
0 kalleka
 
21.03.12
13:32
|select
   | СпТН.ID as ТН,
   | Рег.СуммаРубОстаток as СуммаРубОстаток ,
   | Тдат.tdate Период
   | FROM  (select codeK,tdate from #GrDat)         as Тдат
   | LEFT JOIN $Справочник.ТоварныеНаправления AS СпТН (nolock) ON Тдат.codeK = СпТН.id
   | LEFT OUTER JOIN        (select top 1 Ост.СуммаРубОстаток, Ост.Период, Ост.ТН  from #ОстаткиДни as Ост
   |                where Ост.Период <= Тдат.tdate and Ост.ТН = Тдат.codeK
   |                order by Ост.Период Desc)  as Рег ON Рег.Период = Тдат.tdate and Рег.ТН =   СпТН.ID";  


ругается ТЗ= RS.ВыполнитьИнструкцию(ТекстЗапроса);
{\\STORAGE\DOCUMENTS\PEREPELKIN\ОБЩИЕ\ОБРАБОТКИ\ФИНАНСИРОВАНИЕ ТОВАРНОГО НАПРАВЛЕНИЯ.ERT(98)}: State 42000, native 4104, message [Microsoft][ODBC SQL Server Driver][SQL Server]Не удалось привязать составной идентификатор "Тдат.tdate".


Смысл запроса в следующем: есть таблица с днями #GrDat и таблица с   остатками #ОстаткиДни

GrDat  примерно такой
tdate        codek
01.01.12     id1
02.01.12     id1
....
25.01.12     id1

#ОстаткиДни примерно такой
Период       ТН   СуммаРубОстаток
01.01.12     id1  1000
05.01.12     id1  1500


в итоге нужно получить таблицу
Период       ТН   СуммаРубОстаток
01.01.12     id1  1000
02.01.12     id1  1000
03.01.12     id1  1000
04.01.12     id1  1000
05.01.12     id1  1500
...

ТО есть грубо говоря я получаю остатки по группировке на каждый день

как мне правильно присоединить ОстаткиДни ???
1 kalleka
 
21.03.12
13:33
Проблема как я понимаю в том, что запрос не узнает Тдат.tdate в подзапросе... Как можно передать его??
2 Ёпрст
 
21.03.12
13:38
(0) алиясы добавь, для начала в селек листе
3 Ёпрст
 
21.03.12
13:41
ну и top 1 и сам селек выкини, оставь только левое соединение с #ОстаткиДни  с условием присоединения по tdate и Id
4 kalleka
 
21.03.12
13:45
(3) если Top 1 выкинуть, то получится таблица
Период       ТН   СуммаРубОстаток
01.01.12     id1  1000
02.01.12     id1  0
03.01.12     id1  0
04.01.12     id1  0
05.01.12     id1  1500

а мне надо чтобы получилось

Период       ТН   СуммаРубОстаток
01.01.12     id1  1000
02.01.12     id1  1000
03.01.12     id1  1000
04.01.12     id1  1000
05.01.12     id1  1500
5 kalleka
 
21.03.12
13:47
| LEFT OUTER JOIN          #ОстаткиДни as  Рег ON Рег.Период <= Тдат.tdate and Рег.ТН =   СпТН.ID

может прокатить??
6 Ёпрст
 
21.03.12
13:47
(4) groub by сделай потом
7 Ёпрст
 
21.03.12
13:49
и... с чего это она у тебя такая получится ?
8 Ёпрст
 
21.03.12
13:50
На сколько я понял, у тебя есть остатки на разные дни и табличка всех дат за период. так ?
Ты хочешь , чтоб в "пропуски" дат был остаток от предыдущего дня ?
9 kalleka
 
21.03.12
13:51
(8) все верно
10 Ёпрст
 
21.03.12
13:52
тогда тупо выкидываешь последний лефт джоин и подзапрос с select top 1 втыкаешь в самый верхний селект
11 Ёпрст
 
21.03.12
13:56
тип того

|select
| СпТН.ID as ТН,
|(select top 1 Ост.СуммаРубОстаток from #ОстаткиДни as Ост
|   where Ост.Период <= Тдат.tdate and Ост.ТН = Тдат.codeK
|   order by Ост.Период Desc) as СуммаРубОстаток ,
| Тдат.tdate Период
| FROM  (select codeK,tdate from #GrDat)         as Тдат
| LEFT JOIN $Справочник.ТоварныеНаправления AS СпТН (nolock) ON Тдат.codeK = СпТН.id
12 kalleka
 
21.03.12
14:00
(11) Получилось спасибо

Пробовал похожий вариант, но также выдавал ошибку, другую. Видимо я ошибся

еще раз спасибо)
13 dk
 
21.03.12
14:00
стырено откуда-то

   ТекстЗапроса = "
       |DECLARE @n numeric(19,5)
       |DECLARE @s char(9)
       |SET @n = 0
       |SET @s = $ПустойИд
       |
       |UPDATE #mytemptableSrednie
       |SET @n = CASE WHEN Остаток = 0 AND Товар = @s THEN @n ELSE Остаток END,
       |    Остаток = @n,
       |    Дни = CASE WHEN ((@n <> 0) OR (Остаток <> 0) OR (Оборот<>0) OR (Списание<>0)) THEN 1 ELSE 0 END,
       |    @s = Товар
       |";
       
   Сообщить("Начало: " + ТекущееВремя());
   Сообщить(ТекстЗапроса);
   рс.ВыполнитьСкалярный(ТекстЗапроса);
   Сообщить("Конец: " + ТекущееВремя());