简体   繁体   English

我如何通过日期时间PIVOT TABLE或CrossTab?

[英]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

See SQL Fiddle with Demo 请参阅SQL Fiddle with Demo

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM