SQL Server 2000 - Как повернуть результаты объединения в окончательные результаты запроса?(2+ результаты) - PullRequest
1 голос
/ 12 января 2011

Я задал почти идентичный вопрос и получил действующий рабочий ответ:

Предыдущий вопрос

Здесь есть небольшое изменение, из-за которого ответ на этот вопрос неработать в особом случае в моей базе данных.Во всех ситуациях ожидайте, что в Таблице В будет не более двух возможных записей, как я уже говорил в предыдущем посте.Моя проблема в том, что у меня есть один случай, когда это не так;Мне нужно обработать до 5 пунктов в Таблице B.- Извините, я бы добавил его к исходному сообщению, если бы знал.

Я не вижу, как изменить предыдущий ответ для ситуации с 2+ предметами, с которой я сейчас сталкиваюсь, поскольку она использует MIN и MAXдля решения исходной проблемы.

Это будет использоваться на сервере SQL Server 2000.

Порядок столбцов информации вообще не имеет значения.

Таблица A

ID | Name
---+------
 1 | John
 2 | Jane
 3 | Bob
 4 | Doug
 5 | Smith

Таблица B

ID | NameID | Information
---+--------+------------
 1 |    1   | Apples
 2 |    1   | Apples
 3 |    2   | Pears
 4 |    2   | Grapes
 5 |    3   | Kiwi
 6 |    5   | Apples
 7 |    5   | Pears
 8 |    5   | Grapes
 9 |    5   | Kiwi
 10|    5   | Kumkwat

Желаемый результат

ID | Name | InformationA | InformationB | InformationC | InformationD | InformationE
---+------+--------------+--------------+--------------+--------------+-------------
 1 | John | Apples       | Apples       | NULL         | NULL         | NULL         
 2 | Jane | Pears        | Grapes       | NULL         | NULL         | NULL         
 3 | Bob  | Kiwi         | NULL         | NULL         | NULL         | NULL         
 4 | Doug | NULL         | NULL         | NULL         | NULL         | NULL         
 5 | Smith| Apples       | Pears        | Grapes       | Kiwi         | Kumkwat

1 Ответ

0 голосов
/ 13 января 2011

Это было бы намного проще / эффективнее, если бы были доступны row_number

SELECT Id,
       Name,
       MAX (CASE WHEN idx=0 THEN Information END) AS InformationA ,
       MAX (CASE WHEN idx=1 THEN Information END) AS InformationB ,
       MAX (CASE WHEN idx=2 THEN Information END) AS InformationC ,
       MAX (CASE WHEN idx=3 THEN Information END) AS InformationD ,
       MAX (CASE WHEN idx=4 THEN Information END) AS InformationE 
FROM   (SELECT a.Id,
               a.Name,
               b.Information,
               COUNT(b2.Id) idx
        FROM   TableA a
               LEFT JOIN TableB b
                 ON a.Id = b.NameId
               LEFT JOIN TableB b2
                 on b.NameId = b2.NameId
                    and b2.Id < b.Id
        GROUP  BY a.Id,
                  a.Name,
                  b.Id,
                  b.Information) derived
GROUP  BY Id,
          Name  
...