| Начало » Использование СУБД » 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 Сообщений: 88
 Зарегистрирован: 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 Сообщений: 152
 Зарегистрирован: 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  |  
			| 
				
				
					|  Квази Сообщений: 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
);
 |  
	|  |  | 
 
 
 Текущее время: Fri Oct 31 10:42:18 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.01582 секунд |