1 (edited by maksim.azizov 2019-09-16 04:48:26)

Topic: Вопрос к знатокам баз данных

Здравствуйте, помогите пожалуйста

У меня есть две таблицы
например

(а)

id  name
-------------
1   Bill
2  Katryn
3  Sergy
-------------

(b)

id phone
-------------
1 11111
2 22222
3 33333
-------------

Возможно ли средствами программы или базы данных объединить эти таблицы так, чтобы значения из таблицы (a)  стали бы названиями столбиков для таблицы (b)

то есть вот такой результат

id   Bill   Katryn  Sergy
------------------------------
1  11111 22222  333333
-------------------------------

Re: Вопрос к знатокам баз данных

Возможно средствами программы: добавляйте колонки, строки и данные в таблицу в с помощью скриптов.

Пример, который использует два запроса для формирования кросс-таблицы:

procedure UpdateStatistic(Grid: TdbStringGridEx);
var
  WorkmanData: TDataSet;
  WorkmanData2: TDataSet;
  col, row : integer;
  s: string;
  ShiftCount: integer;
  ShiftProc: integer;
  MaxSP: integer;
begin
  SQLQuery('select workman.id, workman.code, ( select count(id) from shiftbook where shiftbook.id_workman = workman.id ) as shift from workman order by code',WorkmanData);
  SQLQuery('select * from workman order by code',WorkmanData2);

  MaxSP := SQLExecute('select IntersectionRate from config');

//  ShowMessage(  INTTOSTR(MaxSP) );

  Grid.Columns.Clear;
  try
     Grid.Columns.Add(TNxTextColumn);
   except
   end;
  Grid.Columns[0].Width := 40;
  Grid.FixedCols := 1;

  Grid.Columns[0].Color := clbtnFace;
  while not WorkmanData.Eof do
  begin
    try
      Grid.Columns.Add(TNxTextColumn);
    except
    end;
    Grid.Columns[Grid.Columns.count-1].Header.Caption := WorkmanData.FieldByName('code').asString;
    Grid.Columns[Grid.Columns.count-1].Color := clWhite;
    Grid.Columns[Grid.Columns.count-1].Width := 40;

    Grid.AddRow;
    Grid.Cells[0, Grid.RowCount-1] := WorkmanData.FieldByName('code').asString;

    //
    WorkManData.next;
  end;

  row := 0;
  WorkmanData.First;
  while not WorkmanData.Eof do
  begin
    col := 1;
    WorkmanData2.First;
    while not WorkmanData2.Eof do
    begin
      if WorkmanData.FieldByName('id').asString = WorkmanData2.FieldByName('id').asString then
        Grid.Cells[col, row] := '-'
      else
      begin
    // совместные выходы
      s := ' select count(*) from shiftbook left join shiftbook as sb2 on sb2.id_shift = shiftbook.id_shift'+
         ' where shiftbook.id_workman = '+WorkmanData.FieldByName('id').asString+' and sb2.id_workman = '+WorkmanData2.FieldByName('id').asString;
      ShiftCount := SQLExecute(s);
      if WorkManData.FieldByName('shift').asInteger = 0 then
        ShiftProc := 0
      else
        ShiftProc := trunc( ShiftCount / WorkManData.FieldByName('shift').asInteger * 100 );
      //
       Grid.Cells[col, row] := inttostr(ShiftProc)+'%';
       if ShiftProc > MaxSP then
         Grid.Cell[col, row].color := RGB(255,200,200);
      end;
      col := col + 1;
      WorkManData2.next;
    end;
    //
    row := row + 1;
    WorkManData.next;
  end;

end;

P.S. С помощью запроса тоже можно, но сам запрос придётся генерировать с помощью скриптов, а результат не всегда будет гарантирован.

Визуальное программирование: блог и телеграм-канал.

Re: Вопрос к знатокам баз данных

спасибо