我有一个SQL表,用于存储员工的状态和位置
empID date status location
---------------------------------------------------------
001 01.01.2014 1 1
001 02.01.2014 2 1
001 04.01.2014 1 3
....
055 01.01.2014 3 3
055 02.01.2014 4 2
现在我想创建一个列表,其中包含员工ID和第1天到第31天的列
以及Status
和Location
的串联作为值。如果我使用max()
的{{1}},它可以正常工作,但缺少位置信息。如果我尝试
status
它失败了,因为我不能对连接的字符串使用SELECT *
FROM (SELECT (empId), left(datename(dd,[Date]),2)as [day_date], [Status] as status, [Location] as location, [Status] + '|' + [Location] as val FROM [dbo].[table]
WHERE [date] BETWEEN '2014-01-01' AND '2014-01-30') as s
PIVOT (MAX(val) FOR [day_date] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])
)AS p
order by empID
。
我的目标是:
max()
答案 0 :(得分:0)
将[Status]
和[Location]
投射到执行连接的varchar
。我已经随意选择3作为varchar
的长度,但可能会因您的最大可能[Status]
和[Location]
而有所不同。
另外,从内部查询中删除[Status]
和[Location]
列。
SELECT *
FROM (
SELECT
empId,
left(datename(dd,[Date]),2)as [day_date],
cast([Status] AS varchar(3)) + '|' + cast([Location] as varchar(3)) as val
FROM [dbo].[table]
WHERE [date] BETWEEN '2014-01-01' AND '2014-01-30') as s
PIVOT (MAX(val) FOR [day_date] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])
)AS p
order by empID