Я собрал пример сценария моей проблемы, и я надеюсь, что этого достаточно, чтобы кто-то указал мне правильное направление.
у меня две таблицы
Продукты
Мета продукта
Мне нужен набор результатов из следующего
Я собрал пример сценария моей проблемы, и я надеюсь, что этого достаточно, чтобы кто-то указал мне правильное направление.
у меня две таблицы
Продукты
Мета продукта
Мне нужен набор результатов из следующего
В прошлом мы успешно использовали следующий подход...
SELECT [p].ProductID,
[p].Name,
MAX(CASE [m].MetaKey
WHEN 'A'
THEN [m].MetaValue
END) AS A,
MAX(CASE [m].MetaKey
WHEN 'B'
THEN [m].MetaValue
END) AS B,
MAX(CASE [m].MetaKey
WHEN 'C'
THEN [m].MetaValue
END) AS C
FROM Products [p]
INNER JOIN ProductMeta [m]
ON [p].ProductId = [m].ProductId
GROUP BY [p].ProductID,
[p].Name
Также может быть полезно транспонировать агрегации с использованием...
SUM(CASE x WHEN 'y' THEN yVal ELSE 0 END) AS SUMYVal
ИЗМЕНИТЬ
Также стоит отметить, что это использует стандартный SQL ANSI, поэтому он будет работать на разных платформах :)
Я понимаю, что этому уже два года, но меня беспокоит, что принятый ответ требует использования динамического SQL, а ответ, получивший наибольшее количество голосов, не будет работать:
Select P.ProductId, P.Name
, Min( Case When PM.MetaKey = 'A' Then PM.MetaValue End ) As A
, Min( Case When PM.MetaKey = 'B' Then PM.MetaValue End ) As B
, Min( Case When PM.MetaKey = 'C' Then PM.MetaValue End ) As C
From Products As P
Join ProductMeta As PM
On PM.ProductId = P.ProductId
Group By P.ProductId, P.Name
Вы должны использовать Group By, иначе вы получите разнесенный результат. Если вы используете Group By, вы должны обернуть каждый столбец, который не входит в предложение Group By, в агрегатную функцию (или подзапрос).
Если у вас ядро базы данных 2005 и ваша база данных находится в режиме совместимости с 2000, вы можете обойти более низкий режим совместимости, выполнив запрос из базы данных 2005. Нацельтесь на базу данных 2000, используя соглашение об именах из трех частей для ваших таблиц в запросе, например DatabaseNameHere.dbo.TableNameHere