Кто-нибудь знает, можно ли повернуть что-то вроде таблицы ниже. Пока еще можно использовать запрос 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 должен быть переменной, которая группирует все это вместе и делает значение в столбце идентификатора, новом столбце.
Причина, по которой я не использую вторую таблицу по умолчанию, заключается в том, что в каждом листинге могут быть разные фильтры и группы фильтров. И мне нужно иметь возможность выбирать конкретные записи, соответствующие установленному пользователем фильтру.
Благодарю.
Вы можете использовать условную агрегацию:
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;
Это может сделать трюк, только несколько человек присоединяется. Я думаю, что есть несколько способов сделать это, но для меня это довольно легко читать и поддерживать.
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'
Выход:
identifier
, но это может превратиться в довольно сложную задачу :)
Вы можете достичь этого с помощью 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