Сводка с использованием SQL Server 2000
Я собрал образец сценария моей проблемы, и я надеюсь, что его хватит для того, чтобы кто-то указал мне в правильном направлении.
У меня есть две таблицы
Продукция
![alt text]()
Продукт Metap >
![alt text]()
Мне нужен набор результатов из следующих
![alt text]()
Ответы
Ответ 1
В прошлом мы успешно использовали следующий подход...
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 и поэтому он будет работать на разных платформах:)
Ответ 2
Я понимаю, что это два года, но мне кажется, что принятый ответ требует использования динамического 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
Вы должны использовать группу By или вы получите шахматный результат. Если вы используете Group By, вы должны обернуть каждый столбец, который не находится в предложении Group By, в агрегированной функции (или в подзапросе).
Ответ 3
Если ваш механизм базы данных находится в 2005 году, а ваша база данных находится в режиме совместимости в 2000 году, вы можете работать в более низком режиме совместимости, выполнив запрос из базы данных 2005 года. Направьте базу данных 2000 с помощью соглашения о назначении 3-х частей для ваших таблиц в запросе, например DatabaseNameHere.dbo.TableNameHere
Ответ 4
Select a.ProductId
,a.Name
,(Select c.MetaValue
From [Product Meta] c
Where c.ProductId = a.ProductId
And c.MetaKey = 'A') As 'A'
,(Select d.MetaValue
From [Product Meta] d
Where d.ProductId = a.ProductId
And d.MetaKey = 'B') As 'B'
,(Select e.MetaValue
From [Product Meta] e
Where e.ProductId = a.ProductId
And e.MetaKey = 'C') As 'C'
From Products a
Order By a.ProductId Asc
Ответ 5
используйте хранимую процедуру здесь:
http://www.sqlteam.com/article/dynamic-cross-tabs-pivot-tables
также проверьте комментарии.