在同一行显示新旧行数据

时间:2015-10-30 16:26:09

标签: tsql sql-server-2012

我如何进行以下操作:

AgreementID
Name
DOB
Address
PhoneNo
Email
RowNumber (I've added this on myself using Row_NUMBER with name and dob)

因此,想象Joe Bloggs有2个协议,而在第2个协议中,他的一些联系方式已经改变。所以我通过TSQL所需的可视化表示是:

AgreementID  Name  DOB  CurrentAddress, CurrentEmail, CurrentPhone,   
                        OldAddress    , OldEmail    , OldPhone

提前致谢

1 个答案:

答案 0 :(得分:0)

如果要显示同一列中不同的数据条目,可以尝试自联接到同一个表的另一个实例。

客户' Joe Bloggs'应该在“客户”中拥有唯一的标识符。表。你怎么知道他有两个协议而不仅仅是他的儿子住在同一个地方同名?你可以从Name + DOB创建一个复合键。

如果有人与您签订了50份协议怎么办?你想要显示哪些?您可以将两个最近的协议与您的clientID分组的MAX(agreementID)进行比较(可能是来自name + dob的散列复合键)。然后使用由agreementID排序的窗口函数,并将其与第二个最近的函数进行比较。

按名称+ DOB分组的查找最小值(AgreementID)和最大值(AgreementID)将为您提供客户的第一个和当前信息。

针对每个客户端的最小/最大协议ID尝试类似这样的事情:

ALTER [TABLE]
ADD ClientID TEXT(50)

UPDATE [Table]
SET ClientID = (Name + CAST(DOB AS NVARCHAR(30)))

WITH cte AS (
    SELECT MIN(AgreementID) AS 'minID', MAX(AgreementID) AS 'maxID', ClientID FROM [Table]
    GROUP BY ClientID
)
SELECT ClientID, T1.DOB,  T2.Address AS 'CurrentAddress', T2.Email AS 'CurrentEmail', T2.PhoneNo AS 'CurrentPhone',  T1.Address AS 'OldAddress', T1.Email AS 'OldEmail', T1.PhoneNo AS 'OldPhone'
FROM cte
    JOIN [Table] T1 ON cte.ClientID = T1.ClientID
    AND T1.AgreementID = cte.minID
    JOIN [Table] T2 ON cte.ClientID = T2.ClientID
    AND T2.AgreementID = cte.maxID

然后,您可以进一步限制结果,只显示信息发生变化的结果,方法是检查允许更新的字段中T1和T2之间的差异。