Начало » Использование СУБД » Firebird, HQbird, InterBase » простое объединение двух таблиц
простое объединение двух таблиц [сообщение #3320] |
Tue, 10 October 2023 14:02 |
Квази
Сообщений: 33 Зарегистрирован: June 2022
|
Member |
|
|
Дебильноватый вопрос, но как объединить две таблицы?
master - clients
details - t_plan, t_fact с одинаковой структурой (client_id, x_date, x_comment)
нужно вывести все записи из t_plan (критерию соответствуют три записи) и t_fact(критерию соответствуют две записи) в одну таблицу для определенного client_id
client_id t_plan.x_date t_fact.x_date
1 09.10.2023 01.01.2020
1 08.11.2023 01.02.2022
1 09.12.2023
[Обновления: Tue, 10 October 2023 14:02] Известить модератора
|
|
|
|
|
|
|
Re: простое объединение двух таблиц [сообщение #3334 является ответом на сообщение #3328] |
Tue, 10 October 2023 20:58 |
shavluk
Сообщений: 82 Зарегистрирован: June 2022 Географическое положение: Одеса
|
Member |
|
|
1. Таблица, в которой есть группы несвязанными между собой данными в строках, это дело генератора отчетов.
2. Я бы эти таблицы объединил в одну, с признаком план/факт
3. Такой запрос сделать можно, но он немного дурацкий, без курсоров сложно
create or alter procedure TEST
returns (
CLIENT_ID integer,
X_DATE_P date,
X_DATE_F date)
as
declare variable cur_p cursor for (select client_id, x_date from t_plan order by 1, 2);
declare variable cur_f cursor for (select client_id, x_date from t_fact order by 1, 2);
declare variable client_id_p int;
declare variable date_p date;
declare variable client_id_f int;
declare variable date_f date;
declare variable fetch_f boolean = true;
declare variable fetch_p boolean = true;
declare variable eof_p boolean = false;
declare variable eof_f boolean = false;
begin
open cur_p;
open cur_f;
while (1=1) do
begin
if (fetch_p) then
begin
client_id_p = null; date_p = null;
if (not eof_p) then
begin
fetch cur_p into client_id_p, date_p;
eof_p = row_count = 0;
end
end
if (fetch_f) then
begin
client_id_f = null; date_f = null;
if (not eof_f) then
begin
fetch cur_f into client_id_f, date_f;
eof_f = row_count = 0;
end
end
if (client_id_f is null and client_id_p is null) then
leave;
else
begin
client_id = coalesce(minvalue(client_id_p, client_id_f), client_id_p, client_id_f);
x_date_p = iif(client_id = client_id_p, date_p, null);
x_date_f = iif(client_id = client_id_f, date_f, null);
fetch_p = client_id = client_id_p;
fetch_f = client_id = client_id_f;
suspend;
end
end
close cur_p;
close cur_f;
end
|
|
|
|
Re: простое объединение двух таблиц [сообщение #3337 является ответом на сообщение #3328] |
Wed, 11 October 2023 05:51 |
Квази
Сообщений: 33 Зарегистрирован: June 2022
|
Member |
|
|
Может ли факт случиться раньше плана?
А факт без плана? В принципе все факты без планов прицепить потом юнионом.
Может. Сейчас вообще есть таблица (старая) для хранения фактических и плановых дат, но она связана с "мягким" процессом - хочешь планируй, не хочешь не планируй. Но появился еще один процесс, там планы жесткие, обязательные к исполнению и хранятся они в новой таблице. А фактические исполнения так же хранятся в старой.
3. Такой запрос сделать можно, но он немного дурацкий, без курсоров сложно
да, что-то такое я думал, спасибо. Костыль конечно, но пока без него никак.
|
|
|
|
|
|
|
Re: простое объединение двух таблиц [сообщение #3346 является ответом на сообщение #3338] |
Wed, 11 October 2023 17:14 |
Квази
Сообщений: 33 Зарегистрирован: June 2022
|
Member |
|
|
fraks писал(а) Wed, 11 October 2023 08:32Я не уловил, а как связаны даты в планах и фактах? Их нужно как-то в единой хронологии вывести/расположить, или тупо все что есть, с начала таблицы, как закончилось - так и всё?
На данном этапе - упорядочить по возрастанию и все.
А может ли дублироваться в одной таблице запись с одной и той же датой?
теоретически да - никаких препятствий для этого нет.
Да там вообще правильно было сделано в "старой таблице" - запись с полями план и факт, а в этом костыле не хватает связи план-факт и царит полный бардак. Ужесточение режима достигается чеком not null плановых полей в старой таблице, если требуется параллельная работа мягкого и жёсткого режимов - дополнительного признака к какому режиму относится запись.
Можно наверное было обойтись старой, но там слишком много обвязки вокруг нее придется делать. Сейчас в нее могут писать все, и это что-то типа записной книжки. В новую писать могут не только лишь все, плюс графики должны кем-то утверждаться. Что так, что этак получается зоопарк.
|
|
|
|
|
Re: простое объединение двух таблиц [сообщение #3354 является ответом на сообщение #3346] |
Thu, 12 October 2023 06:03 |
fraks
Сообщений: 140 Зарегистрирован: June 2022 Географическое положение: Новосибирск
|
Senior Member |
|
|
Квази писал(а) Wed, 11 October 2023 21:14fraks писал(а) Wed, 11 October 2023 08:32Я не уловил, а как связаны даты в планах и фактах? Их нужно как-то в единой хронологии вывести/расположить, или тупо все что есть, с начала таблицы, как закончилось - так и всё?
На данном этапе - упорядочить по возрастанию и все.
Непонятно - упорядочить по возрастанию даты каждую колонку отдельно, или упорядочить нужно обе колонки одной последовательностью?
В первом сообщении показан вывод что каждая колонка сортируется отдельно и независимо от другой.
А в чем вообще смысл выводить 2 колонки в виде одной таблицы, если эти колонки вообще никак между собой не связаны?
Может проще тогда открыть 2 грида рядом, на каждую таблицу отдельно?
|
|
|
Re: простое объединение двух таблиц [сообщение #3358 является ответом на сообщение #3354] |
Thu, 12 October 2023 11:59 |
Квази
Сообщений: 33 Зарегистрирован: June 2022
|
Member |
|
|
fraks писал(а) Thu, 12 October 2023 06:03
А в чем вообще смысл выводить 2 колонки в виде одной таблицы, если эти колонки вообще никак между собой не связаны?
Может проще тогда открыть 2 грида рядом, на каждую таблицу отдельно?
Возможно будет так. Проблема в том, что планов два - или "свой" или "чужой" (теоретически могут быть оба, но "чужой" это документ, а "свой" это просто напоминалка). Факты подвязаны пока к "своему" плану, но в дальнейшем скорее всего тоже будут "чужие".
/*старая*/
CREATE TABLE PAYMENTS (
ID INTEGER NOT NULL,
CLIENT_ID INTEGER,
PLAN_SUM DOUBLE PRECISION DEFAULT 0,
PLAN_DATE DATE,
/*фактические данные*/
C_DATE DATE,
C_SUM DOUBLE PRECISION DEFAULT 0
);
/*новая*/
CREATE TABLE PAY_PLAN (
PAY_PLAN_ID INTEGER NOT NULL,
CLIENT_ID INTEGER NOT NULL,
PAY_SUM DOUBLE PRECISION,
PAY_DATE DATE
);
вторая таблица отдельно потому, что там куча обвеса - привязываются документы, многоступенчатое утверждение и т.д.
|
|
|
Переход к форуму:
Текущее время: Wed Dec 18 18:48:04 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00887 секунд
|