@chronic86
Ruby on Rails junior

Как составить запрос?

Есть таблица.
Id count date
1 5446 01.01.2018
2 7545 01.01.2018
3 8656 01.01.2018
2 765 01.02.2018
1 8666 01.02.2018

Как построить таблицу?
Id 01.01.2018 01.02.2018
1 5446 8666
2 7545 765
3 8656 null
  • Вопрос задан
  • 79 просмотров
Пригласить эксперта
Ответы на вопрос 4
Делаешь выборку все таблицы, и уже кодом строишь как угодно
Ответ написан
Комментировать
@alexalexes
Решить это можно только в процедурном контексте программирования при постобработки результатов запроса, например, на PHP.
/*Функция преобразования выборки в матрицу */
function get_matrix($rows)
{
  // получаем все значения по id - измерению матрицы (строки матрицы)
 // можно сделать запросом select distinct id from table order by id
  foreach($rows as $row)
    $id_dem[$row['id']] = 1;

 // получаем все значения по date - измерению матрицы (столбцы матрицы)
 // можно сделать запросом select distinct date from table order by date
  foreach($rows as $row)
    $date_dem[$row['date']] = 1;

$map = null;   // если нет значений размерности матрицы, то функция вернет null

// получаем карту не-null значений - непустые ячейки матрицы
  foreach($rows as $row)
    $map[$row['id']][$row['date']] = $row['count'];

// дополняем карту null значениями - получаем полноценную матрицу
  if(isset($id_dem) && isset($date_dem))
    foreach($id_dem as $id => $val_id)
      foreach($date_dem as $date => $val_date)
        $map[$id][$date] = array_key_exists($id, $map) && array_key_exists($date, $map[$id])
                             ? $map[$id][$date] : null;
   return $map;
}
Ответ написан
Комментировать
@chronic86 Автор вопроса
Ruby on Rails junior
Ясно. Значит только пост обработка. Надеялся что есть механизмы реализации подобного в SQL.
Ответ написан
Комментировать
@viras777
А если в выборке будет ещё одна запись с id=1?
Вы не можете менять кол-во столбцов в запросе.
Можно сделать по-другому, первый столбец id, второй массив из count и третий - дата.
Добиться этого можно функцией array_agg
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы