SQL Server 2000 - 如何在查询的最终结果中旋转连接的结果? (2+结果)

时间:2011-01-12 20:41:30

标签: sql-server tsql sql-server-2000

我问了一个几乎相同的问题,得到了一个有效的工作答案:

Previous Question

这里有一个小的改动,使得该问题的答案在我的数据库中的特殊情况下不起作用。在所有情况下,我希望在TableB中最多只有2个可能的条目,正如我在上一篇文章中所说的那样。我的问题是我有一个案例并不成立;我需要在TableB中处理最多5个项目。 - 对不起,如果我知道的话,我会将它添加到原始帖子中。

我没有看到如何修改我之前遇到的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 :(得分:0)

如果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