我问了一个几乎相同的问题,得到了一个有效的工作答案:
这里有一个小的改动,使得该问题的答案在我的数据库中的特殊情况下不起作用。在所有情况下,我希望在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
答案 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