powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Снова сравнение и объединение двух таблиц
17 сообщений из 17, страница 1 из 1
Снова сравнение и объединение двух таблиц
    #39793007
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите соединить две таблицы в одну. Заранее спасибо.
Код: sql
1.
SELECT d1.[t1_lc],d1.[t1_bs],d1.[t1_kodv],d1.[t1_n5] FROM tmp1 //Текущая дата


Код: sql
1.
SELECT d2.[t1_lc],d2.[t1_bs],d2.[t1_kodv],d2.[t1_n5] FROM tmp2 //Предыдущая дата


Если в таблице tmp1 за текущую дату 90 записей, а в таблице tmp2 за предыдущую дату 80 записей, то необходимо получить объединенную таблицу tmpall за текущую дату,
Код: sql
1.
т.е. 90 записей с полями d3.[t1_lc],d3.[t1_bs],d3.[t1_kodv],d3.[t1_n5],d3.[t2_n5]

Причем, если записи tmp1 отсутствуют в tmp2, то необходимо при объединении присвоить d3.[t2_n5]=0
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39793063
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoft,

Перечитайте свой же топик
https://www.sql.ru/forum/1288430-2/obedinit-neskolko-tablic-i-poluchit-odnu-tablicu
Ровно год назад.
Вопрос задавать, так и не научились.

Либо упростите ответ вам, правильно задав вопрос, со всеми данными, либо... ждите экстрасенсов.
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39793436
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теоретически, написать можно. Но! Если за несколько лет работы с данными Вы так и не поняли, что для объединения таблиц нужно, как минимум, указать ПРАВИЛА по которым Вы собираетесь их объединять, то в очередной раз делать за Вас Вашу работу нет никакого желания

Направление поиска

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select 
       d1.[t1_lc],
       d1.[t1_bs],
       d1.[t1_kodv],
       d1.[t1_n5], 
       NVL(d2.[t1_n5], 0) as [t2_n5]
from d1
LEFT JOIN d2 ON (...)



Что именно должно быть указано в условии объединения ON - Вам виднее. На всякий случай напомню, то там возможно указание нескольких условий через AND

Опять же, почему Вы решили, что за текущий день записей больше, чем за предыдущий? А если наоборот? Тоже решаемо. В общем случае здесь должно быть объединение по FULL JOIN и каждое поле в выборке "оборачивается" в NVL()

Т.е. Вы, как обычно, озвучили крайне мало данных для решения задачи.
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39793731
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asdorПеречитайте свой же топик
https://www.sql.ru/forum/1288430-2/obedinit-neskolko-tablic-i-poluchit-odnu-tablicu

Уважаемый asdor, ровно год назад я с вашей же помощью сделал свой отчет.
asdorВопрос задавать, так и не научились.

Я не понимаю, а как надо задавать вопросы?
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39793746
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробую задать вопрос по другому :) Не ругайтесь пожалуйста :)
Короче ведется учет на складе. В базе данных ms sql имеется таблица, к примеру, 1000 клиентов с товарами. Сначала я получил 200 крупных клиентов за текущий день. Это без проблем. Для сравнения мне нужно еще получить 200 крупных клиентов за предыдущий день. Это тоже без проблем. За предыдущий день могут быть совершенно другие 200 крупные клиенты. За текущий день тоже самое. Значит, беру я 200 крупных за текущий день и сравниваю с 200 клиентами за предыдущий день. Если некоторые клиенты за текущий день отсутствует в таблице за предыдущий день, то мне нужна 3 таблица с полями за текущий день: Наименование клиента, текущий остаток, остаток за предыдущий день. Где, остаток за предыдущий день может быть 0, если клиент не попал за текущий день в число крупных.
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39793881
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программисты пишут код, а не художественное произведение Еще раз, чего с чем сравниваете?

Код: sql
1.
Значит, беру я 200 крупных за текущий день и сравниваю с 200 клиентами за предыдущий день



КАК? Как Вы их сравниваете? Как Вы понимаете, что вот этот клиент есть в первом списке, но его нет во втором? "Мамой клянусь" (с) или все-таки какие-то поля анализируете?

Это Вы у себя там видите, а нам здесь это не понятно. Вы привели структуру с 4 полями. И что эти поля обозначают? Можете хотя бы картинку привести с заполненными полями. Что вот есть две такие таблицы, а в результате надо получить вот такую таблицу

Т.е. что я хочу увидеть

Таблица 1

f1 f2 f3111222

Таблица 2

f1 f2 f3111333

Результат объединения

f1f2f3111222333
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39793991
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значит, я делаю сначала 2 запроса за текущий и предыдущий дни:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
IF DOW(m_date)=2 && Если понедельник
       m_today = m_date
       m_yesterday = m_date-3
ELSE
       m_today = m_date
       m_yesterday = m_date-1

ENDIF


Далее...
Код: sql
1.
2.
3.
4.
5.
6.
ok1=OD070(m_today,'TMP1') && Обороты
SELECT 
       kod_kl, t1_bs, t1_n5, t1_kodv, t1_lc 
FROM TMP1
WHERE t1_n5>1000000 ORDER BY t1_lc
INTO CURSOR t_TMP1



Код: sql
1.
2.
3.
4.
5.
6.
ok2=OD070(m_yesterday,'TMP2') && Обороты
SELECT 
       kod_kl, t1_bs, t1_n5, t1_kodv, t1_lc 
FROM TMP1
WHERE t1_n5>1000000 ORDER BY t1_lc
INTO CURSOR t_TMP2


Далее, объединяю курсоры t_TMP1 и t_TMP2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
      d1.*, d2.* 
FROM t_TMP1 d1 
LEFT JOIN t_TMP2 d2 
ON d1.kod_kl=d2.kod_kl 
INTO CURSOR TMPALL

SELECT TMPALL


Как сравнить или объединить 2 таблицы?
Если некоторые клиенты в t_TMP1 за текущий день отсутствует в таблице t_TMP2 за предыдущий день, то мне нужна 3 таблица TMPALL:
Наименование клиента остаток за m_today остаток за m_yesterdayИванов И.И.I1I2Петров П.П.P1P2Алексеев А.А.А10.........Если клиент не попал за текущий день в число крупных, то остаток за предыдущий день должен быть 0. Т.е. Алексеев А.А. не был крупным клиентом за предыдущий день...
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39794015
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы опять умудрились сказать много слов, но так и не ответили на вопрос

С точки зрения объединения 2 таблиц совершенно не важно, как именно эти таблицы были получены. Вопрос только и исключительно в структуре самих таблиц и правиле их объединения

Т.е. из всего этого "потока сознания" с точки зрения заданного вопроса интерес представляет только последний приведенный Вами запрос. Вот это вот

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
      d1.*, d2.* 
FROM t_TMP1 d1 
LEFT JOIN t_TMP2 d2 
ON d1.kod_kl=d2.kod_kl 
INTO CURSOR TMPALL

SELECT TMPALL



И что Вас не устраивает в том, что этот запрос отображает? Можете привести картинку, что было в таблицах t_TMP1 и t_TMP2 и что в результате получилось в TMPALL? Что Вас в этом результате не устраивает?
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39794105
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
За текущий день t_TMP1:

kod_kl t1_n5112000000121500000131750000......

За предыдущий день t_TMP2:

kod_kl t1_n5112000000131320000141100000......

После объединения
Код: sql
1.
2.
3.
4.
5.
6.
SELECT 
      d1.*, d2.* 
FROM t_TMP1 d1 
LEFT JOIN t_TMP2 d2 
ON d1.kod_kl=d2.kod_kl 
INTO CURSOR TMPALL


3 таблица TMPALL должна быть:
Код клиента остаток за m_today остаток за m_yesterday112000000200000012150000013200001317500000.........А у меня вместо 0 другая цифра получается...
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39794109
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не важно как я получаю t_TMP1 и t_TMP2.
Самая главная 3 таблица TMPALL:
Код клиента остаток за m_today остаток за m_yesterday112000000200000012150000013200001317500000.........
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39794579
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftА у меня вместо 0 другая цифра получается...

Это значит, что есть клиент и "вчера", и "сегодня". Ищите по коду или по условиям объединения таблиц

Прописная истина, но, возможно, Вы не в курсе. LEFT JOIN - это расширение INNER JOIN. Т.е. это к результату запроса, который получается по INNER JOIN еще кое-что добавляется. Так что, смотрите, что у Вас в исходных таблицах.

Например, по тем данным, которые Вы показали в 2 исходных таблицах должно было бы получиться вот это

Код клиента остаток за m_today остаток за m_yesterday 11 2000000 200000012 1500000 NULL13 1750000 1320000

А совсем не то, что Вы показали как результат. Вы крайне невнимательны к тому, что сами же и написали
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39794589
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут UNION надо с группировкой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create cursor t_TMP1 (kod_kl i, t1_n5 y)
insert into t_TMP1 values (11, 2000000)
insert into t_TMP1 values (12, 1500000)
insert into t_TMP1 values (13, 1750000)

create cursor t_TMP2 (kod_kl i, t1_n5 y)
insert into t_TMP2 values (11, 2000000)
insert into t_TMP2 values (13, 1320000)
insert into t_TMP2 values (14, 1100000)


select kod_kl, sum(t1_n5) as t1_n5, sum(t1_n5_2) as t1_n5_2;
	from (select kod_kl, t1_n5, cast(0 as y) as t1_n5_2 from t_TMP1;
			union all (select kod_kl, cast(0 as y) as t1_n5, t1_n5 as t1_n5_2 from t_TMP2)) U;
	group by kod_kl
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39794619
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все таки я использовал с LEFT JOIN :)
Сначала я получил 200 крупных клиентов за текущий день:
Код: sql
1.
2.
SELECT TOP 200 * FROM kl_TMP1 ;
GROUP BY kod_kl ORDER BY 2 DESC INTO CURSOR tmp_TMP2


Затем 200 крупных клиентов за предыдущий день:
Код: sql
1.
2.
SELECT TOP 200 * FROM kl_TMP2 ;
GROUP BY kod_kl ORDER BY 2 DESC INTO CURSOR tmp_TMP2


После чего следующее
Код: sql
1.
SELECT d1.*, d2.* FROM tmp_TMP1 d1 LEFT JOIN tmp_TMP2 d2 ON d1.kod_kl=d2.kod_kl INTO CURSOR TMPALL


У меня получилось.
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39794625
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ularsoftУ меня получилось.
Получилось если нормально что клиент из kl_TMP2 никогда не попадет в отчет если его не было в kl_TMP1
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39794628
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замени LEFT JOIN на FULL JOIN
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39794633
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и это создаст проблему
Код: sql
1.
SELECT d1.*, d2.* ...


т.к. имена полей одинаковы, то лучше их явно перечислить
Код: sql
1.
2.
select nvl(TMP1.kod_kl, t_TMP2.kod_kl) as kod_kl, t_TMP1.t1_n5, t_TMP2.t1_n5 as t1_n5_2;
        from t_TMP1 full join t_TMP2 on t_TMP1.kod_kl  = t_TMP2.kod_kl 
...
Рейтинг: 0 / 0
Снова сравнение и объединение двух таблиц
    #39795758
ularsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо Дима, я так и сделаю. Спасибо за советы!
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Снова сравнение и объединение двух таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]