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

Откуда:
Сообщений: 8
Дано две таблицы

CREATE TABLE [dbo].[Table_1](
	[key] [int] NULL,
	[quantity] [int] NULL
)

CREATE TABLE [dbo].[Table_2](
	[key] [int] NULL,
	[quantity] [int] NULL
)

в одной хранятся данные о приходе материала в виде
key quantity
1       1
4       4
2       1
3       2

в одной хранятся данные о расходе материала в виде
key quantity
2       1
3       4
5       1
1       2

Где key - ключ материала, quantity - колличество

Требуется в зависимости от разности между приходом и расходом занести данные в итоговую таблицу вида

[key] [приход] [расход] [в плюсе] [в минусе]
1       1          2                     -1
2       1          1      
3       2          4                     -2
4       4          0          4
5       0          1                     -1

Подскажите как это сделать, либо какие темы почитать?
4 дек 09, 21:34    [8022645]     Ответить | Цитировать Сообщить модератору
 Re: Обьединение таблиц с условием  [new]
iljy
Member

Откуда:
Сообщений: 8711
okolobaxa,

select [key], [приход], [расход],
	case when [приход] > [расход] then cast([приход] - [расход] as varchar) else '' end [в плюсе],
	case when [расход] > [приход] then cast([приход] - [расход] as varchar) else '' end [в минусе]
from 
(
	select coalesce(t1.[key], t2.[key]) [key], isnull(t1.quantity,0) [приход],
			isnull(t2.quantity,0) [расход]
	from dbo.Table_1 t1 full join dbo.Table_2 t2 on t1.[key] = t2.[key]
)t
order by 1
4 дек 09, 22:37    [8022872]     Ответить | Цитировать Сообщить модератору
 Re: Обьединение таблиц с условием  [new]
okolobaxa
Member

Откуда:
Сообщений: 8
Наверное я зря все так далеко абстрагировал от реальной задачи, решение не сработало
В аттаче скрипт всех задействованных таблиц и хранимой процедуры выполняющей положенную задачу.

Порядок действий следующий
1) добавляется приход (список материалов в виде xml)
2) добавляется расход (список материалов в виде xml)
2) парсится хранящийся в базе XML и формируются две таблицы материалов(приходов и расходов)
3) на основании разницы рассчитывается итоговая таблица как написано в первом посте

Вопроса собственно два:
1) Как исправить чтобы заработало?
2) Процедура очень не оптимально написано? Первый раз пытаюсь делать более-мение сложные хранимые процедуры

К сообщению приложен файл (okolobaxa.sql - 3Kb) cкачать
4 дек 09, 23:37    [8023114]     Ответить | Цитировать Сообщить модератору
 Re: Обьединение таблиц с условием  [new]
iljy
Member

Откуда:
Сообщений: 8711
okolobaxa,

не очень понял, что именно надо исправить, кроме синтаксической ошибки - имя keymaterial в последнем запросе надо было заменить на key, но написано и правда сложновато. Не знаю, насколько будет оправдано использование временных таблиц - проверяйте, но курсоры тут точно не нужны.
declare @begin date,    /* начало период */ @end date /* уонец периода */
select @begin = '2009-10-11', @end = '2009-12-30'

;with income as
(
	select * from 
	(select * from dbo.income WHERE date BETWEEN @begin AND @end) i
		cross apply
	(
		select n.value('keymaterial[1]','int') k, n.value('quantity[1]','int') q
		from I.materials.nodes('materials/*') t(n)
	) t
),
expend as
(
	select * from
	(select * from dbo.expenditure WHERE date BETWEEN @begin AND @end) i
		 cross apply
	(
		select n.value('keymaterial[1]','int') k, n.value('quantity[1]','int') q
		from I.materials.nodes('materials/*') t(n)		
	) t
),
t1 as
(
	SELECT k, SUM(q) AS q  FROM income
	group by k
),
t2 as
(
	SELECT k, SUM(q) AS q  FROM expend
	group by k
)
	select [key], [приход], [расход],
	case when [приход] > [расход] then cast([приход] - [расход] as varchar) else '' end [в плюсе],
	case when [расход] > [приход] then cast([приход] - [расход] as varchar) else '' end [в минусе]
	from 
	(
		select coalesce(t1.k, t2.k) [key], isnull(t1.q,0) [приход], isnull(t2.q,0) [расход]
		from t1 full join t2 on t1.k = t2.k
	)t
	order by 1
5 дек 09, 02:35    [8023568]     Ответить | Цитировать Сообщить модератору
 Re: Обьединение таблиц с условием  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Да, за курсоры здесь расстреливают, но здесь курсоры свет божий по сравнению с использованием для данной задачи XML, тем более что он ещё и не типизированный.
Было лень добавить табличку для деталей? Было лень не писать много кода?
6 дек 09, 13:24    [8025208]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить