我有一个存储过程,我试图检索由逗号分隔的用户名字符串中列出的每个用户完成的最后一张票。用户可能没有与它们关联的票证,在这种情况下我知道我只需要返回null。我正在使用的两个表定义如下:
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 :(得分: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
答案 1 :(得分:1)
在这种情况下,我认为您不需要Tickets临时表。您只想知道,“对于逗号分隔列表中的每个用户,他们最近完成的票证(如果有的话)是什么”。
因此,您需要找出每个用户的最新票证,并且您希望确保外部联接该结果,因此如果用户没有票证,您仍然可以将其取回。
这是未经测试的,但希望它能为您提供基本的想法。
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;