2010-05-13 101 views
0

我有存储过程,我试图检索由逗号分隔的用户名字符串中列出的每个用户完成的最后一张票。用户可能没有与他们关联的票证,在这种情况下,我知道我只需要返回空值。那我一起工作的两个表的定义如下:SQL Server 2008 - 更新临时表

User 
---- 
UserName, 
FirstName, 
LastName 

Ticket 
------ 
ID, 
CompletionDateTime, 
AssignedTo, 
AssignmentDate, 
StatusID 

TicketStatus 
------------ 
ID, 
Comments 

我已经创造了一种我试图返回最后完成票以逗号分隔的用户名列表的存储过程。每条记录都需要包含与其相关的评论。目前,我尝试以下:

CREATE TABLE #Tickets 
(
    [UserName] nvarchar(256), 
    [FirstName] nvarchar(256), 
    [LastName] nvarchar(256), 
    [TicketID] int, 
    [DateCompleted] datetime, 
    [Comments] text 
) 

-- This variable is actually passed into the procedure 
DECLARE @userList NVARCHAR(max) 
SET @userList='user1,user2,user2' 

-- Obtain the user information for each user 
INSERT INTO #Tickets 
(
    [UserName], 
    [FirstName], 
    [LastName] 
) 
SELECT 
    u.[UserName], 
    u.[FirstName], 
    u.[LastName] 
FROM 
    User u 
    INNER JOIN dbo.ConvertCsvToTable(@userList) l ON u.UserName=l.item 

在这一点上,我的用户名,名字和姓氏为每个用户传入但是,我不知道如何真正得到最后一张票完成。每个用户。

我该怎么做?我相信我应该更新我创建的临时表。同时,id不知道如何获取更新语句中的最后一条记录。

谢谢!

+0

是TicketID顺序(即,每个用户的最后一张门票是否也具有该用户的任何门票的最高ID?)以及如何连接“Ticket”和“User”? 'AssignedTo'是否加入到'UserName'? – 2010-05-13 15:25:26

回答

1

一旦加载数据到#tickets(如你的例子一样),这个查询会给你最近的每个用户名:

select * from #tickets x 
inner join 
(select username, max(DateCompleted) as theDate 
    from #tickets group by username) y 
ON x.username = y.username, x.DateCompleted = y.theDate 
+0

#票是空的,不是吗? – 2010-05-13 15:31:04

+0

我假设他现有的代码在此之前,但我会添加一个评论来说明这一点。 – egrunin 2010-05-13 15:57:06

1

我不认为你需要临时门票表在这种情况下。你只是想知道,“对于逗号分隔列表中的每个用户,他们最近完成的门票(如果有的话)是什么”。

因此,您需要为每个用户找出最近的门票,并且您希望确保外部连接的结果,所以如果用户没有门票,您仍然可以将其退回。

这是未经测试,但希望它给你的基本想法。

SELECT u.UserName 
     , u.FirstName 
     , u.LastName 
     , t.ID 
     , t.CompletionDateTime 
     , t.AssignedTo 
     , t.AssignmentDate 
     , t.StatusID 
     FROM dbo.User u INNER JOIN dbo.ConvertCsvToTable(@userList) ON u.UserName=l.item 
    LEFT OUTER JOIN 
      (SELECT t.AssignedTo 
       , MAX(t.CompletionDateTime) CompletionDateTime) 
      FROM Ticket t 
     GROUP BY t.AssignedTo) t 
    ON t.AssignedTo = u.UserName;