这对我来说太棘手了...
我在 Microsoft SQL Server 2008 上工作,我有一个包含人名的表。这些人的名字可能会随着时间而改变,因此也有历史信息。
例子:
PID Sequence Name
1 0 Michael Hansen
2 0 Ulla Hansen
2 94 Ulla Margrethe Hansen
2 95 Ulla Margrethe Jensen
3 0 Daniella Oldfield
3 95 Daniella Quist
(我还没有建立这个表——所以我不能进去改变数据的存储方式)。PID 为 1 的人称为 Michael Hansen。这是他的当前姓名(序列 0 始终指定当前姓名)并且由于没有其他记录,他一直被命名为 Michael Hansen。
个人 PID 2 当前称为 Ulla Hansen(序列 0)。在此之前,她被称为 Ulla Margrethe Hansen(因为这是下一个序列号),在此之前,她又被称为 Ulla Margrethe Jensen。
我对这张表的了解是当前名称始终是序列 0。我还知道,如果有两个名称,则下一个序列是 95。以及三个历史名称:当前名称:序列 0,在该序列之前 94 和最旧的名称95.
我的数据库包含最多 6 个历史名称的信息(序列 0、91、92、93、94、95)。
现在我被告知要在一个新表中列出所有名称,每人只有一行,例如:
PID Name1 Name2 Name3
1 Michael Hansen
2 Ulla Hansen Ulla Margrethe Hansen Ulla Margrethe Jensen
3 Daniella Oldfield Daniella Quist
到目前为止,我有以下几乎可以工作的 SQL:
SELECT PID
,MAX(CASE sequence WHEN 0 THEN Name ELSE '' END) AS Name1
,MAX(CASE sequence WHEN 91 THEN Name ELSE '' END) AS Name2
,MAX(CASE sequence WHEN 92 THEN Name ELSE '' END) AS Name3
,MAX(CASE sequence WHEN 93 THEN Name ELSE '' END) AS Name4
,MAX(CASE sequence WHEN 94 THEN Name ELSE '' END) AS Name5
,MAX(CASE sequence WHEN 95 THEN Name ELSE '' END) AS Name6
FROM tblShipTypeHistory
GROUP BY PID
它在每个 PID 的一行中为我提供了我想要的所有名称。当前名称也始终列在 Name1 下。问题是我需要第二个最新的名字出现在 Name2 列等中。我的情况(当然)只有在一个人有六个名字的情况下才有效。
所以我需要做的是根据 PID 实际拥有的名称动态命名列 Name2 到 Name6。所以我尝试动态地构建我的 SQL(DECLARE @SQL AS NVARCHAR(MAX) 然后将 @SQL = 设置为上面的 SQL 示例)。然后我尝试了类似的东西
SET @SQL = 'SELECT ....
,MAX(CASE sequence WHEN 91 THEN Name ELSE '' END) AS Name' + COUNT(PID) - 4 + '
,MAX(CASE sequence WHEN 92 THEN Name ELSE '' END) AS Name' + COUNT(PID) - 3 + '
,MAX(CASE sequence WHEN 93 THEN Name ELSE '' END) AS Name' + COUNT(PID) - 2 + '
,MAX(CASE sequence WHEN 94 THEN Name ELSE '' END) AS Name' + COUNT(PID) - 1 + '
,MAX(CASE sequence WHEN 95 THEN Name ELSE '' END) AS Name' + COUNT(PID) + '
逻辑上这可以工作(它会给出正确的列名),但不幸的是语法“+ count(PID)”不起作用。
(呸!)那么有谁对此有解决方案吗?
先感谢您。