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

Откуда:
Сообщений: 10
ПОМОГИТЕ!!!

Есть две таблицы
NOM AMORT
inw name ctoim s_iznoc inw name ctoim sam
01 name1 100 100 02 name2 200 10
02 name2 200 150 03 name3 300 25
03 name3 300 0 04 name4 400 35
04 name4 400 200
05 name5 500 500

Как мне объединить эти две таблицы, чтобы поле sam из таблицы AMORT вставилось в таблицу NOM, но поля inw, name,ctoim, s_iznoc в таблице NOM не изменились, т.е. как перенести поле sam,если таблицы по полям равны, но имеют не одинаковое содержание из за столбца s_iznoc.

Заранее благодарен,
Алексей.
14 фев 03, 08:55    [129014]     Ответить | Цитировать Сообщить модератору
 Re: Помогите объединить таблицы  [new]
AMur
Member

Откуда: Красноярск
Сообщений: 7
так поясни вопрос у тебя есть две таблицы
NOM(inw,name,ctoim,s_iznoc ) и AMORT (inw,name,ctoim,sam )
каким образом их надо объеденить чтобы какой результать то получился ?
напиши конеретно а то как то не очень яясно
что ты подразумевал под "объеденить"

Антон
14 фев 03, 09:04    [129031]     Ответить | Цитировать Сообщить модератору
 Полное пояснение  [new]
Elected
Member

Откуда:
Сообщений: 10
Имеются две таблицы OC_NOM и OC_AMORT
OC_NOM						

INW PROD_NAME DPOST CTOIM VOCCT S_IZNOC OTDEL
00136 ТЕРМОСТАТ 21.04.2001 4 783,30 5,00 379,72 3
00147 ШКАФ ВЫТЯЖНОЙ 04.07.2001 7 496,67 10,00 993,88 3
00941 ХОЛОДИЛЬНИК 28.02.2002 4 300,00 0,00 4 300,00 3
00942 ЧАСЫ 28.02.2002 260,00 0,00 260,00 3
00943 СТУЛЬЯ - 3 ШТ. 28.02.2002 960,00 0,00 960,00 3


OC_AMORT							

INW PROD_NAME PERIOD CTOIM VOCCT S_IZNOC SAM OTDEL
00136 ТЕРМОСТАТ 200212 4 783,30 5,00 379,72 19,93 3
00147 ШКАФ ВЫТЯЖНОЙ 200212 7 496,67 10,00 993,88 62,47 3


Необходимо объединить эти две таблицы так, чтобы получилось:

Должно получиться
INW	PROD_NAME	PERIOD	DPOST	CTOIM	VOCCT	S_IZNOC	OTDEL	SAM

00136 ТЕРМОСТАТ 200212 21.04.2001 4 783,30 5,00 379,72 3 19,93
00147 ШКАФ ВЫТЯЖНОЙ 200212 04.07.2001 7 496,67 10,00 993,88 3 62,47
00941 ХОЛОДИЛЬНИК 28.02.2002 4 300,00 0,00 4 300,00 3
00942 ЧАСЫ 28.02.2002 260,00 0,00 260,00 3
00943 СТУЛЬЯ - 3 ШТ. 28.02.2002 960,00 0,00 960,00 3



Следует учесть, что в таблице OC_AMORT данные храняться за определенный период PERIOD - например 200212 (декабрь 2002 года), а в таблице OC_NOM находятся все объекты PROD_NAME.
14 фев 03, 14:47    [129394]     Ответить | Цитировать Сообщить модератору
 Re: Помогите объединить таблицы  [new]
Crip
Member

Откуда:
Сообщений: 2490
ИМХО обычный left join... Только структурку можно было и нормализовать...
14 фев 03, 15:04    [129425]     Ответить | Цитировать Сообщить модератору
 Re: Помогите объединить таблицы  [new]
Elected
Member

Откуда:
Сообщений: 10
OC_NOM

INW PROD_NAME DPOST CTOIM VOCCT S_IZNOC OTDEL
136 ТЕРМОСТАТ 21.04.2001 4 783,30 5,00 379,72 3
147 ШКАФ 04.07.2001 7 496,67 10,00 993,88 3
941 ХОЛОДИЛ. 28.02.2002 4 300,00 0,00 4 300,00 3
942 ЧАСЫ 28.02.2000 260,00 0,00 260,00 3
943 СТУЛЬЯ 28.02.2002 960,00 0,00 960,00 3



OC_AMORT
INW PROD_NAME PERIOD CTOIM VOCCT S_IZNOC SAM OTDEL
136 ТЕРМОСТАТ 200212 4 783,30 5,00 379,72 19,93 3
147 ШКАФ 200212 7 496,67 10,00 993,88 62,47 3


Должно получиться при объединении

INW PROD_NAME DPOST CTOIM VOCCT S_IZNOC SAM OTDEL
136 ТЕРМОСТАТ 21.04.2001 4 783,30 5,00 379,72 19,93 3
147 ШКАФ 04.07.2001 7 496,67 10,00 993,88 62,47 3
941 ХОЛОДИЛ. 28.02.2002 4 300,00 0,00 4 300,00 3
942 ЧАСЫ 28.02.2000 260,00 0,00 260,00 3
943 СТУЛЬЯ 28.02.2002 960,00 0,00 960,00 3


НОРМАЛИЗОВАННАЯ СТРУКТУРА
14 фев 03, 18:18    [129638]     Ответить | Цитировать Сообщить модератору
 Re: Помогите объединить таблицы  [new]
Павел [Ghost]
Member

Откуда: Москва
Сообщений: 36
шутник
это называет не нормализованная структура, а нормальный вид вопроса :))
нормализованная структура - это от организации хранения данных, грубо говоря - чтобы не было повторения хранения данных
14 фев 03, 18:28    [129649]     Ответить | Цитировать Сообщить модератору
 Re: Помогите объединить таблицы  [new]
Breakneck
Member

Откуда: Kiev
Сообщений: 2454
Не издевались бы над человеком, а написали запрос, что ли....

update a
from nom a left join amort b
on (a.inw=b.inw и все те поля, по которым Вы определяете одинаковые записи)


Относительно того, какая таблица должна быть в update, определитесь. А то в первом постинге у Вас из Amort в Nom вставляется, а потом уже и наоборот.
14 фев 03, 18:56    [129666]     Ответить | Цитировать Сообщить модератору
 Re: Помогите объединить таблицы  [new]
Breakneck
Member

Откуда: Kiev
Сообщений: 2454
2Crip: А по поводу структуры таблиц: ведь, возможно, человек в одной таблице хранит данные, а в другой позволяет пользователям над ними издеваться, не зная о существовании временных таблиц. :-))
2Elected: Но вообще, согласен с 2Crip, стоит Вам полумать о нормализации базы.
14 фев 03, 18:59    [129669]     Ответить | Цитировать Сообщить модератору
 Re: Помогите объединить таблицы  [new]
Elected
Member

Откуда:
Сообщений: 10
1-я таблица:

SELECT *
FROM NOM

Вывод данных:

! inw ! name ! dpost ! ctoim ! vocct ! s_iznoc ! otdel !
! 001 ! Текст1 ! 21.04.2001 ! 2000 ! 5 ! 300 ! 3 !
! 002 ! Текст2 ! 04.07.2001 ! 3000 ! 7 ! 900 ! 3 !
! 003 ! Текст3 ! 28.02.2002 ! 5000 ! 4 ! 5000 ! 4 !
! 004 ! Текст4 ! 28.02.2002 ! 8000 ! 5 ! 8000 ! 3 !
! 005 ! Текст5 ! 28.02.2002 ! 1000 ! 10 ! 1000 ! 3 !

2-я таблица

SELECT *
FROM AMORT

! inw ! name ! period ! ctoim ! vocct ! s_iznoc ! sam ! otdel !
! 001 ! Текст1 ! 200207 ! 2000 ! 5 ! 50 ! 10 ! 3 !
! 002 ! Текст2 ! 200207 ! 3000 ! 7 ! 400 ! 90 ! 3 !
! 001 ! Текст1 ! 200208 ! 2000 ! 5 ! 100 ! 20 ! 3 !
! 002 ! Текст2 ! 200208 ! 3000 ! 7 ! 500 ! 100 ! 3 !
! 001 ! Текст1 ! 200209 ! 2000 ! 5 ! 150 ! 55 ! 3 !
! 002 ! Текст2 ! 200209 ! 3000 ! 7 ! 600 ! 150 ! 3 !
! 001 ! Текст1 ! 200210 ! 2000 ! 5 ! 200 ! 30 ! 3 !
! 002 ! Текст2 ! 200210 ! 3000 ! 7 ! 700 ! 200 ! 3 !
! 001 ! Текст1 ! 200211 ! 2000 ! 5 ! 250 ! 70 ! 3 !
! 002 ! Текст2 ! 200211 ! 3000 ! 7 ! 800 ! 110 ! 3 !
! 001 ! Текст1 ! 200212 ! 2000 ! 5 ! 300 ! 50 ! 3 !
! 002 ! Текст2 ! 200212 ! 3000 ! 7 ! 900 ! 100 ! 3 !

Поля 1-й таблицы inw, name, ctoim, vocct, s_iznoc, otdel имеют значения
такие же, как поля 2-й таблицы inw, name, ctoim, vocct, s_iznoc, otdel.
Во 2-й таблице нет поля dpost, а в 1-й таблице не хватает полей period и sam.
Во 2-й таблице выводятся поля inw, name, ctoim, s_iznoc, otdel по периодам (поле
period). Мне необходимо получить данные в поле sam именно определенного периода,
допустим 200212 (декабрь 2002 года) и по отдела (поле otdel). Поэтому необходимо
объединить эти 2 таблицы так, чтобы получилось следующее:

! inw ! name ! dpost ! ctoim ! vocct ! s_iznoc ! sam ! otdel !
! 001 ! Текст1 ! 21.04.2001 ! 2000 ! 5 ! 300 ! 50 ! 3 !
! 002 ! Текст2 ! 04.07.2001 ! 3000 ! 7 ! 900 ! 100 ! 3 !
! 004 ! Текст4 ! 28.02.2002 ! 8000 ! 5 ! 8000 ! 0 ! 3 !
! 005 ! Текст5 ! 28.02.2002 ! 1000 ! 10 ! 1000 ! 0 ! 3 !


Мужики, может конечно я и профан в SQL, но задачка моя не из лёгких.
Я уже кучу учебников перелопатил по SQL, чего только не пробывал,
результат отрицательный, могу получить примерный интерсесующий меня ответ
только если поле sam>=0, а всё наименование 1-й таблицы, где sam<=0 не
появляется хоть убей, весь смысл в этом чертовом поле, мне нужно его внедрить в первуй таблицу отсортировав поле sam из второй таблицы по отделам и периоду. Спасибо всем.

С Уважением,
Алексей.
14 фев 03, 19:42    [129697]     Ответить | Цитировать Сообщить модератору
 Re: Помогите объединить таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
SELECT a.*, ISNULL(b.sam, 0)

FROM NOM a
LEFT OUTER JOIN AMORT b ON b.otdel = a.otdel AND b.period = CONVERT(char(6), a.dpost, 112)


SELECT a.*, (SELECT TOP 1 sam FROM AMORT b WHERE b.otdel = a.otdel AND b.period = CONVERT(char(6), a.dpost, 112))

FROM NOM a
16 фев 03, 15:29    [129992]     Ответить | Цитировать Сообщить модератору
 Re: Помогите объединить таблицы  [new]
Elected
Member

Откуда:
Сообщений: 10
Спасибо Glory! Всё получилось, нет проблем!
26 фев 03, 11:55    [135586]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить