Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 последовательное создание таблиц  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
Добрый день!

Мой запрос преобразует содержимое двух таблиц (отмечено цветом) и сохраняет результаты своей работы в третью таблицу с определенного вида названием. Научите, пожалуйста, как автоматизировать подачу следующих пар таблиц "на станок".

Пары, например, такие

[122013b1] и [122013_b] с полем dt = 01.01.2014 сохраняются в [2014_01g];
[122012b1] и [122012_b] с полем dt = 01.01.2013 сохраняются в [2013_01g];
[122011b1] и [122011_b] с полем dt = 01.01.2012 сохраняются в [2012_01g].

Спасибо за науку!

+
SELECT 
	m.regn AS "regn", 
	m.code AS "code",
	m.gr_5 AS "group",
	m.iitg AS "iitg",
	m.oitg AS "oitg",
	'01.01.2010' AS "dt"
INTO [2010_01g]
FROM (
		SELECT 
			r.regn AS "regn", 
			a.code AS "code", 
			a.gr_5 AS "gr_5", 
			isnull(sum(b.iitg*a.a_p), 0) AS "iitg",
			iif(a.code<200,isnull(sum(b.oitga),0), isnull(sum(b.oitgp),0)) AS "oitg" 
		FROM [dbo].[gr_1] a						
			CROSS JOIN (SELECT DISTINCT regn FROM [dbo].[122009b1]) AS r(regn)	
			LEFT JOIN [dbo].[122009b1] b  
				ON a.num_sc LIKE b.num_sc			
				AND b.regn = r.regn			
		GROUP BY r.regn, a.code, a.gr_5
		UNION 
		SELECT 
			r.regn AS "regn", 
			a.code AS "code", 
			a.gr_5 AS "gr_5", 
			isnull(sum(b.itogo*a.a_p), 0) AS "iitg",
			0 AS "oitg"
		FROM [dbo].[gr_1] a						
			CROSS JOIN (SELECT DISTINCT regn FROM [dbo].[122009_b]) AS r(regn)					
			LEFT JOIN [dbo].[122009_b] b  				
				ON a.num_sc LIKE b.num_sc			
				AND b.regn = r.regn			
		GROUP BY r.regn, a.code, a.gr_5
) m
ORDER BY 1, 2
9 апр 14, 10:24    [15854192]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
PlanB
Мой запрос преобразует содержимое двух таблиц (отмечено цветом) и сохраняет результаты своей работы в третью таблицу с определенного вида названием. Научите, пожалуйста, как автоматизировать подачу следующих пар таблиц "на станок".

Пары, например, такие

[122013b1] и [122013_b] с полем dt = 01.01.2014 сохраняются в [2014_01g];
[122012b1] и [122012_b] с полем dt = 01.01.2013 сохраняются в [2013_01g];
[122011b1] и [122011_b] с полем dt = 01.01.2012 сохраняются в [2012_01g].
Динамический SQL и цикл по таблицам.

То есть в цикле ваш запрос должен формироваться с нужными именами таблиц в строковой переменной, и потом выполняться командой EXEC(переменная)
9 апр 14, 10:56    [15854458]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
alexeyvg, покажите, а :)
9 апр 14, 11:45    [15854790]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
Читайте справку по EXEC(), написали же.
9 апр 14, 14:23    [15856082]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
PlanB
alexeyvg, покажите, а :)
Что показать? Готовое решение, или у вас что то конкретное не получается?
9 апр 14, 14:55    [15856340]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
alexeyvg
PlanB
alexeyvg, покажите, а :)
Что показать? Готовое решение, или у вас что то конкретное не получается?
пример под катом. пишет ошибку "Сообщение 402, уровень 16, состояние 1, строка 26 Типы данных varchar и date в операторе add несовместимы."

+
declare @n1 VARCHAR(20)
declare @n2 VARCHAR(20)
declare @d1 DATE
declare @o1 VARCHAR(20)
declare @dyn_sql VARCHAR(8000)

DECLARE @tab_cur CURSOR  

set @tab_cur = cursor for 
	select n1, n2, d1, o1 from [dbo].[n2] where o1 in ('2014_01g', '2013_10g')
open @tab_cur


fetch next from @tab_cur into @n1, @n2, @d1, @o1
while @@FETCH_STATUS = 0
begin

SET @dyn_sql = 
'
SELECT 
	m.regn AS "regn", 
	m.code AS "code",
	m.gr_5 AS "group",
	m.iitg AS "iitg",
	m.oitg AS "oitg",
	''' +@d1+''' AS "dt"
INTO [' +@o1+ ']
FROM (
		SELECT 
			r.regn AS "regn", 
			a.code AS "code", 
			a.gr_5 AS "gr_5", 
			isnull(sum(b.iitg*a.a_p), 0) AS "iitg",
			iif(a.code<200,isnull(sum(b.oitga),0), isnull(sum(b.oitgp),0)) AS "oitg" 
		FROM [dbo].[gr_1] a						
			CROSS JOIN (SELECT DISTINCT regn FROM [dbo].['+@n1+']) AS r(regn)	
			LEFT JOIN [dbo].['+@n1+'] b  
				ON a.num_sc LIKE b.num_sc			
				AND b.regn = r.regn			
		GROUP BY r.regn, a.code, a.gr_5
		UNION 
		SELECT 
			r.regn AS "regn", 
			a.code AS "code", 
			a.gr_5 AS "gr_5", 
			isnull(sum(b.itogo*a.a_p), 0) AS "iitg",
			0 AS "oitg"
		FROM [dbo].[gr_1] a						
			CROSS JOIN (SELECT DISTINCT regn FROM [dbo].['+@n2+']) AS r(regn)					
			LEFT JOIN [dbo].['+@n2+'] b  				
				ON a.num_sc LIKE b.num_sc			
				AND b.regn = r.regn			
		GROUP BY r.regn, a.code, a.gr_5
) m
ORDER BY 1, 2
'
exec (@dyn_sql)
fetch next from @tab_cur into @n1, @n2, @d1, @o1
end
CLOSE tab_cur
9 апр 14, 15:18    [15856542]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
o-o
Guest
>>>declare @d1 DATE
...
>>>''' +@d1+''' AS "dt"

вот что Вы делаете по сути:
declare @d1 DATE
select '...' +  @d1
9 апр 14, 15:39    [15856685]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
поменял на

declare @n2 VARCHAR(20)
declare @d1 VARCHAR(20)
declare @o1 VARCHAR(20)
declare @dyn_sql VARCHAR(8000)

DECLARE @tab_cur CURSOR  

set @tab_cur = cursor for 
	select n1, n2, '['+cast(d1 as varchar(20))+']' as "d1", o1 from [dbo].[n2] where o1 in ('2014_01g', '2013_10g')
open @tab_cur


fetch next from @tab_cur into @n1, @n2, @d1, @o1
while @@FETCH_STATUS = 0
begin

SET @dyn_sql = 
'
SELECT 
	m.regn AS "regn", 
	m.code AS "code",
	m.gr_5 AS "group",
	m.iitg AS "iitg",
	m.oitg AS "oitg",
	['+@d1+'] AS "dt" 
INTO [' +@o1+ ']


чета опять пишет нехорошее. что ж за хрень

Сообщение 207, уровень 16, состояние 1, строка 8
Недопустимое имя столбца "[2014-01-01] AS "dt"
INTO [2014_01g".
Сообщение 207, уровень 16, состояние 1, строка 8
Недопустимое имя столбца "[2013-10-01] AS "dt"
INTO [2013_10g".
Сообщение 16916, уровень 16, состояние 1, строка 62
Курсор с именем "tab_cur" не существует.
9 апр 14, 15:51    [15856794]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
наверное тогда просто '+@d1+' вместо ['+@d1+'], но не получается. ненавижу даты!
9 апр 14, 15:53    [15856813]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
ааааа, три апострофа, ну да, сори
9 апр 14, 15:58    [15856847]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
запускается, но не до конца работает.
вылезла неприятная ошибка, не пойму в чем дело...

Сообщение 16916, уровень 16, состояние 1, строка 63
Курсор с именем "tab_cur" не существует.

declare @n1 VARCHAR(20)
declare @n2 VARCHAR(20)
declare @d1 VARCHAR(20)
declare @o1 VARCHAR(20)
declare @dyn_sql VARCHAR(8000)

DECLARE @tab_cur CURSOR  

set @tab_cur = cursor for 
	select n1, n2, '['+cast(d1 as varchar(20))+']' as "d1", o1 from [dbo].[n2] where o1 in ('2014_01g', '2013_10g')
open @tab_cur


fetch next from @tab_cur into @n1, @n2, @d1, @o1
while @@FETCH_STATUS = 0
begin

SET @dyn_sql = 
'
SELECT 
	m.regn AS "regn", 
	m.code AS "code",
	m.gr_5 AS "group",
	m.iitg AS "iitg",
	m.oitg AS "oitg",
	'''+@d1+''' AS "dt"
INTO [' +@o1+ ']
FROM (
		SELECT 
			r.regn AS "regn", 
			a.code AS "code", 
			a.gr_5 AS "gr_5", 
			isnull(sum(b.iitg*a.a_p), 0) AS "iitg",
			iif(a.code<200,isnull(sum(b.oitga),0), isnull(sum(b.oitgp),0)) AS "oitg" 
		FROM [dbo].[gr_1] a						
			CROSS JOIN (SELECT DISTINCT regn FROM [dbo].['+@n1+']) AS r(regn)	
			LEFT JOIN [dbo].['+@n1+'] b  
				ON a.num_sc LIKE b.num_sc			
				AND b.regn = r.regn			
		GROUP BY r.regn, a.code, a.gr_5
		UNION 
		SELECT 
			r.regn AS "regn", 
			a.code AS "code", 
			a.gr_5 AS "gr_5", 
			isnull(sum(b.itogo*a.a_p), 0) AS "iitg",
			0 AS "oitg"
		FROM [dbo].[gr_1] a						
			CROSS JOIN (SELECT DISTINCT regn FROM [dbo].['+@n2+']) AS r(regn)					
			LEFT JOIN [dbo].['+@n2+'] b  				
				ON a.num_sc LIKE b.num_sc			
				AND b.regn = r.regn			
		GROUP BY r.regn, a.code, a.gr_5
) m
ORDER BY 1, 2
'
exec (@dyn_sql)
fetch next from @tab_cur into @n1, @n2, @d1, @o1
end
CLOSE tab_cur
9 апр 14, 16:05    [15856892]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
PlanB,

> не пойму в чем дело...

в невнимательности.

CLOSE @tab_cur
9 апр 14, 17:06    [15857309]     Ответить | Цитировать Сообщить модератору
 Re: последовательное создание таблиц  [new]
PlanB
Member

Откуда: Moscow
Сообщений: 2767
9 апр 14, 17:07    [15857318]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить