SQL聚合函数反对数据透视表中的连接字符串

时间:2014-03-11 16:36:03

标签: sql-server database pivot aggregate

我有一个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天的列 以及StatusLocation的串联作为值。如果我使用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()

1 个答案:

答案 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