SQL - Можно ли сделать пользовательский столбец по значениям строки?

0

Кто-нибудь знает, можно ли повернуть что-то вроде таблицы ниже. Пока еще можно использовать запрос SELECT.

+----+-----------+---------------+------------+
| id | listingId | value         | identifier |
+----+-----------+---------------+------------+
| 1  | 1a        | Alaskan Husky | race       |
| 2  | 1a        | High          | activity   |
| 3  | 1a        | White         | colour     |
| 4  | 1b        | Akita         | race       |
| 5  | 1b        | Medium        | activty    |
| 6  | 1b        | Grey          | colour     |
+----+-----------+---------------+------------+

Для чего-то вроде этого, все еще имея возможность использовать запрос select.

+----+-----------+---------------+---------+--------+
| id | listingId | race          | activty | colour |
+----+-----------+---------------+---------+--------+
| 1  | 1a        | Alaskan Husky | High    | White  |
| 2  | 1b        | Akita         | Medium  | Grey   |
+----+-----------+---------------+---------+--------+

Я также хочу, чтобы иметь возможность искать эту новую "таблицу". Скажем, пользователь выбрал фильтр с чем-то вроде этого:

  • Гонка: Аляскинский Хаски
  • Активность: Средняя, Высокая

Затем он должен вернуть идентификатор 1a.

Причиной этого является то, что я не могу выполнить правильный запрос SELECT, когда все значения помещаются в разные строки..

Как вы можете видеть, листингId должен быть переменной, которая группирует все это вместе и делает значение в столбце идентификатора, новом столбце.

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

Благодарю.

Показать ещё 1 комментарий
Теги:

3 ответа

2
Лучший ответ

Вы можете использовать условную агрегацию:

select min(id) id, listingId, 
       max(case when [identifier] = 'race' then [value] end) race,
       max(case when [identifier] = 'activity' then [value] end) activity,
       max(case when [identifier] = 'colour' then [value] end) colour
from table t
group by listingId;
  • 0
    Как я уже упоминал в другом ответе, было бы неплохо, если бы он мог автоматически определять значение в столбце идентификатора с соответствующим значением. И сделайте новый запрос выбора с условиями фильтра. Но я сам сейчас в это разбираюсь. Спасибо за предложение, хотя.
  • 0
    Это определенно самый читаемый ответ. Я немного отредактировал ваш ответ, поэтому он также делает новое предложение выбора, о котором я также просил. Это может быть полезно для других, еще раз спасибо!
1

Это может сделать трюк, только несколько человек присоединяется. Я думаю, что есть несколько способов сделать это, но для меня это довольно легко читать и поддерживать.

CREATE TABLE [dbo].[the_table](
    [id] [int] NULL,
    [listingId] [varchar](50) NULL,
    [value] [varchar](50) NULL,
    [identifier] [varchar](50) NULL
) ON [PRIMARY]
GO

INSERT INTO the_table (id, listingId, value, identifier)
VALUES  (1, '1a', 'alaskan huskey', 'race'),
        (2, '1a', 'high', 'activity'),
        (3, '1a', 'white', 'colour'),
        (4, '1b', 'akita', 'race'),
        (5, '1b', 'medium', 'activity'),
        (6, '1b', 'grey', 'colour')

SELECT * FROM 
(SELECT a.id, a.listingID, a.value AS race, b.value as activity, c.value as colour
FROM the_table a
INNER JOIN the_table b
ON a.listingId  = b.listingId 
INNER JOIN the_table c
ON a.listingId  = c.listingId 
WHERE a.identifier = 'race'
AND b.identifier = 'activity'
AND c.identifier = 'colour') AS t
WHERE t.colour = 'white'

Выход:

Изображение 174551

  • 0
    Спасибо за предложение. Я не очень большой поклонник предопределения переменных, так как значения «идентификаторов» не являются постоянными. Можно ли будет «автоматически определять» значения и добавлять их в виде столбцов с соответствующими значениями? Кроме того, как мне выполнить новый запрос SELECT для этой новой таблицы? Спасибо.
  • 1
    Вы могли бы написать некоторый динамический SQL, чтобы он просматривал имена столбцов, основываясь на том, что у вас есть в столбце identifier , но это может превратиться в довольно сложную задачу :)
Показать ещё 2 комментария
0

Вы можете достичь этого с помощью Pivot

DECLARE @MyTable TABLE (Id INT, listingId VARCHAR(20),Value  VARCHAR(20), identifier varchar(20))
INSERT INTO @MyTable VALUES
(1,'1a','Alaskan Husky' ,'race'),
(2,'1a','High' ,'activity'),
(3,'1a','White'  ,'colour'),
(4,'1b','Akita' ,'race'),
(5,'1b','Medium','activity'),
(6,'1b','Grey' ,'colour')

SELECT *
FROM
(
SELECT listingId, identifier,Value FROM @MyTable)t
PIVOT(MIN(Value)
      FOR identifier
      IN (race,activity,colour)
      )p
  • 0
    Эй, спасибо за предложение, к сожалению, ваш код неверен.
  • 0
    Подскажите, пожалуйста, причину, по которой код не действителен? Как я это проверил, и он дает такой же результат, как вы показали в своем вопросе

Ещё вопросы

Сообщество Overcoder
Наверх
Меню