[英]How can I PIVOT TABLE Or CrossTab By Datetime?
I need crosstab or pivot table By select Datetime. 我需要交叉表或数据透视表通过选择日期时间。
Table filesTA 表文件TA
EmpNo ChkDate ChkIn
00001 2012-10-10 00:00:00.000 2012-10-10 07:22:00.000
00002 2012-10-10 00:00:00.000 2012-10-10 07:30:00.000
00001 2012-10-11 00:00:00.000 2012-10-11 07:13:00.000
00002 2012-10-11 00:00:00.000 2012-10-11 07:34:00.000
00001 2012-10-12 00:00:00.000 2012-10-12 07:54:00.000
00002 2012-10-12 00:00:00.000 2012-10-12 07:18:00.000
I have tried following 我试过以下
SELECT tf.EmpNo,tf.ChkDate,tf.ChkIn
FROM (SELECT EmpNo,ChkDate,ChkIn
,ROW_NUMBER() OVER(PARTITION BY EmpNo ORDER BY ChkDate) as tfNum
FROM filesTA) AS tf
PIVOT(MIN(ChkDate) FOR tfNum IN ('2012-10-10'))
WHERE tf.ChkDate Between '2012-10-10' and '2012-10-12'
But getting following error 但得到以下错误
Incorrect syntax near 'PIVOT'. You may need to set the compatibility
level of the current database to a higher value to enable this feature.
See help for the SET COMPATIBILITY_LEVEL option of ALTER DATABASE.
Desired Output: 期望的输出:
EmpNo 10 11 12
00001 07:22 07:13 07:54
00002 07:30 07:34 07:18
I'm beginning learn pivot and crosstab. 我开始学习枢轴和交叉表。 please help me to get my query working.
请帮助我让我的查询工作。
If you are not able to use the PIVOT
function, then you can use an aggregate function with a CASE
statement: 如果您无法使用
PIVOT
函数,则可以将聚合函数与CASE
语句一起使用:
select empno,
max(case when datepart(d, chkdate) = 10
then convert(char(5), ChkIn, 108) end) [10],
max(case when datepart(d, chkdate) = 11
then convert(char(5), ChkIn, 108) end) [11],
max(case when datepart(d, chkdate) = 12
then convert(char(5), ChkIn, 108) end) [12]
from filesTA
where ChkDate Between '2012-10-10' and '2012-10-12'
group by empno
See SQL Fiddle with Demo 请参阅SQL Fiddle with Demo
If you have access to PIVOT
, then your syntax will be: 如果您有权访问
PIVOT
,那么您的语法将是:
select empno, [10], [11], [12]
from
(
select empno, datepart(d, chkdate) chkdate,
convert(char(5), ChkIn, 108) chkin
from filesTA
) src
pivot
(
max(chkin)
for chkdate in ([10], [11], [12])
) piv
IF you need to use PIVOT on databases with compatibility level below 90 it won't work. 如果您需要在兼容级别低于90的数据库上使用PIVOT,它将无法工作。
Read this ALTER DATABASE Compatibility Level 阅读此ALTER DATABASE兼容级别
After your modified DATABASE Compatibility Level your query will be look so 修改后的DATABASE兼容级别后,您的查询将如此
;WITH cte AS
(
SELECT EmpNo, CAST(ChkIn AS time) AS ChkIn, DATEPART(mm, ChkDate) as mm_ChkDate
FROM filesTA
WHERE ChkDate Between '2012-10-10' and '2012-10-12'
)
SELECT EmpNo, [10], [11], [12] FROM cte
PIVOT(
MIN(ChkIn) FOR cte.mm_ChkDate IN ([10], [11], [12])) x
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.