Отображение значений классов для разных типов классов в одной строке

#sql #sqlite

#sql #sqlite

Вопрос:

Я не знаю, как написать запрос в sqlite, который был бы из этой таблицы:

 image_id | feature_id | feature_val
_________|____________|____________
  12     |    1       |     41
  12     |    2       |     82
  12     |    3       |     75

  74     |    1       |     23
  74     |    2       |     35
  74     |    3       |     72
 

Возвращена таблица результатов:

 image_id |  feature_1_val  | feature_2_val | feautre_3_val
_________|_________________|_______________|_______________
  12     |       41        |      82       |       75
  74     |       23        |      35       |       72      
 

Мы можем предположить, что количество объектов изображения является постоянным и равно 3.
Я был бы очень благодарен за вашу помощь.

Ответ №1:

Вызывается процесс превращения строк в столбцы pivoting . Это лучше всего делать на стороне клиента. Например, Microsoft Excel имеет широкую поддержку через сводные таблицы.

Но это не невозможно в SQL. Вот один пример использования max(case( трюка:

 select  image_id
,       max(case when feature_id = 1 then feature_val end) as feature_1_val
,       max(case when feature_id = 2 then feature_val end) as feature_2_val
from    YourTable
group by
        image_id
 

Комментарии:

1. Я очень похожий код, но без «max», и он не работал должным образом. Большое спасибо! 🙂

Ответ №2:

Учитывая ограничения, изложенные в вопросе, вы можете создать неэлегантный, но работоспособный подход, используя подзапросы:

 SELECT it.image_id,
       (SELECT feature_val FROM ImageTable WHERE ImageTable.image_id = it.image_id AND ImageTable.feature_id = 1) AS feature_1_val,
       (SELECT feature_val FROM ImageTable WHERE ImageTable.image_id = it.image_id AND ImageTable.feature_id = 2) AS feature_2_val,
       (SELECT feature_val FROM ImageTable WHERE ImageTable.image_id = it.image_id AND ImageTable.feature_id = 3) AS feature_3_val 
  FROM ImageTable AS it
  GROUP BY it.image_id