SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » простое объединение двух таблиц
простое объединение двух таблиц [сообщение #3320] Tue, 10 October 2023 14:02 Переход к следующему сообщению
Квази в настоящее время не в онлайне  Квази
Сообщений: 32
Зарегистрирован: 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: простое объединение двух таблиц [сообщение #3322 является ответом на сообщение #3320] Tue, 10 October 2023 14:12 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 800
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
FULL JOIN

зы: не вникал глубоко в задачу.
Re: простое объединение двух таблиц [сообщение #3324 является ответом на сообщение #3322] Tue, 10 October 2023 15:50 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
Если я правильно понимаю что факта без плана не бывает, то просто inner c plan и left c fact
Re: простое объединение двух таблиц [сообщение #3325 является ответом на сообщение #3324] Tue, 10 October 2023 16:07 Переход к предыдущему сообщениюПереход к следующему сообщению
Квази в настоящее время не в онлайне  Квази
Сообщений: 32
Зарегистрирован: June 2022
Member
Надо было сразу пояснить. План и факт жестко не связаны. Это типа графика занятий. По плану у нас раз в неделю "атжуманя", а по факту на прошлой неделе бухали и потому есть три занятия по плану, и только два по факту, и не в те даты, в которые планировалось.
Re: простое объединение двух таблиц [сообщение #3328 является ответом на сообщение #3325] Tue, 10 October 2023 18:11 Переход к предыдущему сообщениюПереход к следующему сообщению
IP в настоящее время не в онлайне  IP
Сообщений: 25
Зарегистрирован: January 2023
Junior Member
Вырвиглазная какая-то постановка...

Взять план и прилефтжойнить к нему первый факт по критерию первый факт после плана, но менее следующего плана. Для того, чтобы обрести в каждой строке текущую и следующую дату плана оный план придется сджойнить сам с собой.
Может ли факт случиться раньше плана?
А факт без плана? В принципе все факты без планов прицепить потом юнионом.
Re: простое объединение двух таблиц [сообщение #3334 является ответом на сообщение #3328] Tue, 10 October 2023 20:58 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время не в онлайне  shavluk
Сообщений: 67
Зарегистрирован: 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: простое объединение двух таблиц [сообщение #3335 является ответом на сообщение #3325] Tue, 10 October 2023 21:46 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
Квази писал(а) Tue, 10 October 2023 16:07
Надо было сразу пояснить. План и факт жестко не связаны. Это типа графика занятий. По плану у нас раз в неделю "атжуманя", а по факту на прошлой неделе бухали и потому есть три занятия по плану, и только два по факту, и не в те даты, в которые планировалось.
Таки может быть спьяну незапланированное занятие?
Re: простое объединение двух таблиц [сообщение #3337 является ответом на сообщение #3328] Wed, 11 October 2023 05:51 Переход к предыдущему сообщениюПереход к следующему сообщению
Квази в настоящее время не в онлайне  Квази
Сообщений: 32
Зарегистрирован: June 2022
Member
Может ли факт случиться раньше плана?
А факт без плана? В принципе все факты без планов прицепить потом юнионом.
Может. Сейчас вообще есть таблица (старая) для хранения фактических и плановых дат, но она связана с "мягким" процессом - хочешь планируй, не хочешь не планируй. Но появился еще один процесс, там планы жесткие, обязательные к исполнению и хранятся они в новой таблице. А фактические  исполнения так же хранятся в старой.

 3. Такой запрос сделать можно, но он немного дурацкий, без курсоров сложно
да, что-то такое я думал, спасибо. Костыль конечно, но пока без него никак.
Re: простое объединение двух таблиц [сообщение #3338 является ответом на сообщение #3337] Wed, 11 October 2023 08:32 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 108
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
Я не уловил, а как связаны даты в планах и фактах? Их нужно как-то в единой хронологии вывести/расположить, или тупо все что есть, с начала таблицы, как закончилось - так и всё?
Re: простое объединение двух таблиц [сообщение #3339 является ответом на сообщение #3338] Wed, 11 October 2023 08:38 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 108
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
А может ли дублироваться в одной таблице запись с одной и той же датой?
Вообще, для ясности вопроса и облегчения понимания кто на ком стоял, нужно сразу давать минимальный скрипт DDL и сразу некоторое кол-во данных, скриптом же, что бы желающие могли воспроизести ситуацию у себя и дать запрос который любой другой желающий мог бы воспроизвести у себя.
Re: простое объединение двух таблиц [сообщение #3340 является ответом на сообщение #3339] Wed, 11 October 2023 08:44 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 108
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
Я бы начал с того что замесил обе таблицы в кучу
select 
  x_date,
  tname 't_plan'
from t_plan
where (client_id = 1)

union all

select 
  x_date,
  tname 't_fact'
from t_fact
where (client_id = 1)

order by
  x_date
и потом бы в SP выгребал из этого всего данные, раскладывая по двум колонкам, на основании tname, и делая suspend когда или дата меняется или поле уже занято.
Но таким методом получается единая хронология для обоих колонок, а не как в исходном посте показано, что данные в обоих колонках начинаются с первой записи и никакой связи между колонками нет.
Re: простое объединение двух таблиц [сообщение #3342 является ответом на сообщение #3340] Wed, 11 October 2023 13:22 Переход к предыдущему сообщениюПереход к следующему сообщению
Старый Плюшев в настоящее время не в онлайне  Старый Плюшев
Сообщений: 95
Зарегистрирован: August 2022
Географическое положение: Ленинград
Member
Да там вообще правильно было сделано в "старой таблице" - запись с полями план и факт, а в этом костыле не хватает связи план-факт и царит полный бардак. Ужесточение режима достигается чеком not null плановых полей в старой таблице, если требуется параллельная работа мягкого и жёсткого режимов - дополнительного признака к какому режиму относится запись.
Re: простое объединение двух таблиц [сообщение #3346 является ответом на сообщение #3338] Wed, 11 October 2023 17:14 Переход к предыдущему сообщениюПереход к следующему сообщению
Квази в настоящее время не в онлайне  Квази
Сообщений: 32
Зарегистрирован: June 2022
Member
fraks писал(а) Wed, 11 October 2023 08:32
Я не уловил, а как связаны даты в планах и фактах? Их нужно как-то в единой хронологии вывести/расположить, или тупо все что есть, с начала таблицы, как закончилось - так и всё?
На данном этапе - упорядочить по возрастанию и все.

А может ли дублироваться в одной таблице запись с одной и той же датой?
теоретически да - никаких препятствий для этого нет.

Да там вообще правильно было сделано в "старой таблице" - запись с полями план и факт, а в этом костыле не хватает связи план-факт и царит полный бардак. Ужесточение режима достигается чеком not null плановых полей в старой таблице, если требуется параллельная работа мягкого и жёсткого режимов - дополнительного признака к какому режиму относится запись.
Можно наверное было обойтись старой, но там слишком много обвязки вокруг нее придется делать. Сейчас в нее могут писать все, и это что-то типа записной книжки. В новую писать могут не только лишь все, плюс графики должны кем-то утверждаться. Что так, что этак получается зоопарк.
Re: простое объединение двух таблиц [сообщение #3347 является ответом на сообщение #3346] Wed, 11 October 2023 17:33 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 800
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
да не парься.
тебе ведь нужны данные за конкретный интервал, а не от рождества Христова.
неужели там охулиарды записей подпадающих под условие?
Re: простое объединение двух таблиц [сообщение #3350 является ответом на сообщение #3347] Wed, 11 October 2023 19:03 Переход к предыдущему сообщениюПереход к следующему сообщению
IP в настоящее время не в онлайне  IP
Сообщений: 25
Зарегистрирован: January 2023
Junior Member
Сдается мне надо все джойны начинать с таблицы "календарь" и лефтджойнить к ней и план и факт.
Если в дне цеплять нечего и пришли нуллы и на план и на факт, откинуть по желанию такие пустышки в секции where.
груп бай по дням может посхлопывать возникшие раздвоения строк.

без метаданных сложно сообразить.
Re: простое объединение двух таблиц [сообщение #3354 является ответом на сообщение #3346] Thu, 12 October 2023 06:03 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 108
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Senior Member
Квази писал(а) Wed, 11 October 2023 21:14
fraks писал(а) Wed, 11 October 2023 08:32
Я не уловил, а как связаны даты в планах и фактах? Их нужно как-то в единой хронологии вывести/расположить, или тупо все что есть, с начала таблицы, как закончилось - так и всё?
На данном этапе - упорядочить по возрастанию и все.
Непонятно - упорядочить по возрастанию даты каждую колонку отдельно, или упорядочить нужно обе колонки одной последовательностью?
В первом сообщении показан вывод что каждая колонка сортируется отдельно и независимо от другой.

А в чем вообще смысл выводить 2 колонки в виде одной таблицы, если эти колонки вообще никак между собой не связаны?
Может проще тогда открыть 2 грида рядом, на каждую таблицу отдельно?
Re: простое объединение двух таблиц [сообщение #3358 является ответом на сообщение #3354] Thu, 12 October 2023 11:59 Переход к предыдущему сообщению
Квази в настоящее время не в онлайне  Квази
Сообщений: 32
Зарегистрирован: 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
);
вторая таблица отдельно потому, что там куча обвеса - привязываются документы, многоступенчатое утверждение и т.д.
Предыдущая тема: Вопрос по округлению
Следующая тема: Клиент Firebird 4 на Windows XP
Переход к форуму:
  


Текущее время: Sun Apr 28 06:34:15 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01550 секунд