Сводка с использованием SQL Server 2000 - PullRequest
15 голосов
/ 23 ноября 2008

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

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

Продукты

alt text

Продукт Мета

alt text

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

alt text

Ответы [ 5 ]

24 голосов
/ 27 апреля 2011

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

14 голосов
/ 28 ноября 2008

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

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

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

6 голосов
/ 01 апреля 2010

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

3 голосов
/ 23 ноября 2008
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 голосов
/ 23 ноября 2008

используйте хранимую процедуру здесь: http://www.sqlteam.com/article/dynamic-cross-tabs-pivot-tables

также проверьте комментарии.

...