У меня по ходу что-то не так с временными таблицами, конкретно с заполнением их
INSERT INTO и просто
INTO. Я их практически почти не использую на работе, обхожусь как-то вложенными запросами...
Я начал писать другой вариант запроса, но походу смысла нет.
Вот несколько вариантов выполнения запроса
1. Не отработал
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#tmp') AND sysstat & 0xf = 3 )
DROP TABLE #tmp
CREATE TABLE #tmp (
Период datetime DEFAULT '17530101' NOT NULL
, ГруппаТМЦ char(9) DEFAULT ' 0 ' NOT NULL
, Остаток numeric(19,5) DEFAULT 0 NOT NULL
UNIQUE CLUSTERED (Период,Остаток,ГруппаТМЦ))
INSERT INTO #tmp
SELECT ОстаткиТМЦ.Период as Период
, Номенклатура.sp11470 as ГруппаТМЦ
, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
From #T66016D8B3FF64D1D8B0C35DCD0DCB250 as ОстаткиТМЦ
INNER JOIN sc335 as Номенклатура ON Номенклатура.ID = ОстаткиТМЦ.Номенклатура
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0
select * from #tmp
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{\\TSCLIENT\E\1С\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(542)}: State HY007, native 0, message [Microsoft][ODBC SQL Server Driver]Связанная инструкция не подготовлена
2. Выдает пустые данные, в Query Analyzer есть данные
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#tmp') AND sysstat & 0xf = 3 )
DROP TABLE #tmp
CREATE TABLE #tmp (
Период datetime DEFAULT '17530101' NOT NULL
, Фирма char(9) DEFAULT ' 0 ' NOT NULL
, Остаток numeric(19,5) DEFAULT 0 NOT NULL
UNIQUE CLUSTERED (Период,Остаток,Фирма))
INSERT INTO #tmp
SELECT ОстаткиТМЦ.Период as Период
, ОстаткиТМЦ.Фирма as Фирма
, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
From #T928C5CD84A624468A4BA630720281EFB as ОстаткиТМЦ
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0
select * from #tmp
1.77 сек., 0 строк
3. Не отрабатывает
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#tmp') AND sysstat & 0xf = 3 )
DROP TABLE #tmp
CREATE TABLE #tmp (
Период datetime DEFAULT '17530101' NOT NULL
, Склад char(9) DEFAULT ' 0 ' NOT NULL
, ГруппаТМЦ char(9) DEFAULT ' 0 ' NOT NULL
, Остаток numeric(19,5) DEFAULT 0 NOT NULL
UNIQUE CLUSTERED (Период,Остаток,Склад,ГруппаТМЦ))
INSERT INTO #tmp
SELECT ОстаткиТМЦ.Период as Период
, ОстаткиТМЦ.Склад as Склад
, Номенклатура.sp11470 as ГруппаТМЦ
, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
From #T20C18217C4D147F8BB71D0ABB9B1140C as ОстаткиТМЦ
INNER JOIN sc335 as Номенклатура ON Номенклатура.ID = ОстаткиТМЦ.Номенклатура
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0
select * from #tmp
глРС.ВыполнитьИнструкцию(ТекстЗапроса,ИТЗ);
{\\TSCLIENT\E\1С\АНАЛИЗ ТМЦ ПО ПЕРИОДАМ.ERT(542)}: State 21S01, native 213, message [Microsoft][ODBC SQL Server Driver][SQL Server]Insert Error: Column name or number of supplied values does not match table definition.
4. По номенклатура - опять пустые данные
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE
ID=OBJECT_ID('tempdb..#tmp') AND sysstat & 0xf = 3 )
DROP TABLE #tmp
CREATE TABLE #tmp (
Период datetime DEFAULT '17530101' NOT NULL
, Номенклатура char(9) DEFAULT ' 0 ' NOT NULL
, Остаток numeric(19,5) DEFAULT 0 NOT NULL
UNIQUE CLUSTERED (Период,Остаток,Номенклатура))
INSERT INTO #tmp
SELECT CAST('20130501' as DateTime) as Период
, ОстаткиТМЦ.Номенклатура AS Номенклатура
, ОстаткиТМЦ.КоличествоКонечныйОстаток as Остаток
From (
select
rb2412_vt.Номенклатура,
sum(rb2412_vt.КоличествоОстаток) as КоличествоНачальныйОстаток,
sum(rb2412_vt.КоличествоПриход) as КоличествоПриход,
sum(rb2412_vt.КоличествоРасход) as КоличествоРасход,
sum(rb2412_vt.КоличествоОстаток) + sum(rb2412_vt.КоличествоПриход) - sum(rb2412_vt.КоличествоРасход) as КоличествоКонечныйОстаток
from (
select
ra2412_vt.sp2406 as Номенклатура,
case when ra2412_vt.debkred = 0 then ra2412_vt.sp2410 else 0 end as КоличествоПриход,
case when ra2412_vt.debkred = 1 then ra2412_vt.sp2410 else 0 end as КоличествоРасход,
0 as КоличествоОстаток
from ra2412 as ra2412_vt (nolock)
inner join _1sjourn as j2412_vt (nolock) on j2412_vt.iddoc = ra2412_vt.iddoc
where j2412_vt.date_time_iddoc > '20130501' and j2412_vt.date_time_iddoc < '20130508AHX3Y8 2PNWY 0'
and j2412_vt.rf2412 = 0x1
union all
select
rg2412_vt.sp2406 as Номенклатура,
0,
0,
rg2412_vt.sp2410
from rg2412 as rg2412_vt (nolock)
where rg2412_vt.period={d '2013-04-01'}
) as rb2412_vt
group by
rb2412_vt.Номенклатура
having
sum(rb2412_vt.КоличествоОстаток) <> 0 or
sum(rb2412_vt.КоличествоПриход) <> 0 or
sum(rb2412_vt.КоличествоРасход) <> 0 or
sum(rb2412_vt.КоличествоОстаток) + sum(rb2412_vt.КоличествоПриход) - sum(rb2412_vt.КоличествоРасход) <> 0
) as ОстаткиТМЦ
WHERE ОстаткиТМЦ.КоличествоКонечныйОстаток <> 0
select * from #tmp
1.83 сек., 0 строк
Вопрос на засыпку: можно ли написать запрос с остатками по периодами / разными группировкам без заполнения в отчете временных таблиц, только вложенными запросами? Таблицы из УложитьСписокОбъектов принимаются на ура...
P.S. Позже попробую разбить на части, выполнить запрос с ВТ ОстаткиОбороты, затем создать временную таблицу и отдельным запросом её заполнить чтоли...