2012-11-12 3 views
4

Мне нужна кросс-таблица или сводная таблица. Выберите дату и время.Как я могу PIVOT TABLE или CrossTab по дате?

Таблица filesTA

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 

Я попытался следующие

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' 

Но получить следующее сообщение об ошибке

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. 

Желаемая Выход:

EmpNo  10  11  12 
00001  07:22 07:13 07:54 
00002  07:30 07:34 07:18 

Я начинаю изучать стержни и кросс-таблицы. пожалуйста, помогите мне, чтобы мой запрос работал.

+1

Какая версия SQL-сервера вы используете? Ошибка уровня совместимости указывает на необходимость обновления уровня совместимости базы данных по крайней мере до 9 (2005) ... – PinnyM

+0

I'm Runnings SQL SERVER 2008 R2 – nettoon493

+0

Вы не приняли/не прокомментировали ответ bluefeet. Он дает желаемый результат. Тебе нужно что-то еще? – Sami

ответ

3

Если вы не можете использовать функцию 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 

См SQL Fiddle with Demo

Если у вас есть доступ к 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 

См SQL Fiddle with Demo

+0

большое спасибо. это работает! : D – nettoon493

0

ЕСЛИ вам нужно использовать PIVOT в базах данных с уровнем совместимости ниже 90, это не сработает.

Читать эту ALTER DATABASE Compatibility Level

После измененного уровня 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