2008-11-23 3 views
15

Я собрал образец сценария моей проблемы, и я надеюсь, что его хватит для того, чтобы кто-то указал мне в правильном направлении.Сводка с использованием SQL Server 2000

У меня есть две таблицы

Продукты

alt text

Мета продукта

alt text

Мне нужен результирующий набор из следующих

alt text

ответ

14

Мы успешно использовали следующий подход в прошлом ...

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 

EDIT

Также стоит отметить, что это использует стандарт ANSI SQL и поэтому он будет работать на разных платформах :)

+0

Это работает только когда значения являются статическими, т. е. вы заранее знаете значения столбца. – 2011-04-27 14:24:55

3
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 
+2

Спасибо, GregD, но я боюсь, что это не поможет мне. Проблема в том, что при добавлении новой записи в таблицу ProductMeta мне придется вернуться и изменить это утверждение. Я пытаюсь сохранить мои пункты обслуживания как можно ниже. – sykespro 2008-11-23 20:31:23

+0

Ah..Ok Тогда вам, вероятно, захочется взглянуть на эту статью: http://www.oreillynet.com/pub/a/network/2004/12/17/crosstab.html – GregD 2008-11-23 21:57:35

6

Если ваш механизм базы данных находится в 2005 году, а ваша база данных находится в режиме совместимости в 2000 году, вы можете работать в более низком режиме совместимости, выполнив запрос из базы данных 2005 года. Направьте базу данных 2000 с помощью соглашения об именовании 3-х сторон для ваших таблиц в запросе, таком как DatabaseNameHere.dbo.TableNameHere

24

Я понимаю, что это два года, но мне кажется, что принятый ответ требует использования динамического 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, в агрегированной функции (или в подзапросе).

Смежные вопросы