2016-06-09 75 views
0

我想在SQL Server Management Studio中使用对表的自引用来添加计算列。SQL计算列从临时表

我列如下:

[Employee ID] [Previous State Date] [Previous State] 
       [Next State Date]  [Next State] 

我想增加一列,显示第三状态([下一步状态]列之后发生)。例如,如果有人从状态去 - “乙 - > C,将有两行:

[Employee 1][1/1/2016][a][1/2/2016][b] 
[Employee 1][1/2/2016][b][1/3/2016][c] 

我想要的数据只是表明:

[Employee 1][1/1/2016][a][1/2/2016][b][c] 

要做到这一点,我创建两列,即连接状态,日期和员工ID的[PreviousID][NextID]

我想用一个临时表中的temp.[Next State] WHERE table.[Next State] = temp.[Previous State]

当我尝试这种新列带来,我得到的错误:

Subqueries are not allowed in this context. Only scalar expressions are allowed.

我的代码:

SELECT * INTO #temp FROM table 

ALTER TABLE table 
ADD [Next Next State] AS (SELECT [Next State] 
          FROM temp 
          WHERE table.[Next State] = temp.[Previous State]) 
+1

你可以标记你正在使用SQL Server你的问题的意见。另外,这听起来你需要一个单独的状态表来管理这些状态。 – Peter4499

+0

已标记。即时通讯使用SQL Server Management Studio 2012 –

+0

你有基本表的主键吗? –

回答

1

忘记临时表并对集合函数和CTE使用GROUP BY查询。喜欢的东西:

WITH EarliestLastChanges(EmployeeID, EarliestStateChange, LatestStateChange) 
AS 
(SELECT 
    [Employee ID] AS EmployeeID, 
    MIN([Previous State Date]) AS EarliestStateChange 
    MAX([Next State Date]) AS LatestStateChange 
FROM 
    table 
GROUP BY 
    [Employee ID]) 
SELECT 
    ELC1.EmployeeID, 
    Concatenated field for Earliest from T1, 
    Concatenated field for Latest from T2 
FROM 
    EarliestLastChanges AS ELC1 
    JOIN 
    table as T1 
    ON ELC1.EmployeeID = T1.[Employee ID] AND ELC1.EarliestStateChange = T1.[Previous State Date] 
    EarliestLastChanges AS ELC2 
    JOIN 
    table as T2 
    ON ELC2.EmployeeID = T2.[Employee ID] AND ELC2.EarliestStateChange = T2.[Next State Date] 

我同意上面重新设计将是一个更好的方式去