я имею таблицу SQL, которая содержит дату, время, идентификатор сотрудника и тип удара (IN, OUT), данные, как следующие:дата преобразования строк в столбцы без поворота
EMPID Date Time Punch type
123 2015-08-01 08:00 AM EMPIN
123 2015-08-01 01:00 PM EMPOUT
123 2015-08-01 02:30 PM EMPIN
123 2015-08-01 07:30 PM EMPOUT
123 2015-08-02 09:30 PM EMPIN
123 2015-08-02 11:00 AM EMPIN
123 2015-08-02 06:00 PM EMPOUT
123 2015-08-03 08:00 AM EMPIN
123 2015-08-03 06:00 PM EMPOUT
123 2015-08-03 02:30 AM EMPOUT
123 2015-08-04 08:00 AM EMPIN
123 2015-08-04 06:00 PM EMPOUT
Я хочу, чтобы отобразить время ударов по датам, но без сводной таблицы, потому что я не могу применить агрегированную функцию по типу времени, я уже пробовал точку опоры, но это не сработало.
И я хочу, чтобы отобразить их как следующие:
EMPID Punch type 2015-08-01 2015-08-02 2015-08-03 2015-08-04
123 EMPIN 08:00 AM 11:00 AM 08:00 AM 08:00 AM
123 EMPOUT 01:00 PM 06:00 PM 06:00 PM 06:00 PM
123 EMPIN 02:30 PM 09:30 PM
123 EMPOUT 07:30 PM 02:30 AM
, мой код:
DECLARE @StartDate DATETIME = '20150801'
,@EndDate DATETIME = '20150831'
if NOT EXISTS (
SELECT * FROM tempdb.dbo.sysobjects o
WHERE o.xtype IN ('U')
AND o.id = object_id(N'tempdb..#TABLE')
)
CREATE TABLE #TABLE (date DATETIME,numberOFWorkingHour INTEGER,empID NVARCHAR(6),time time,funckey NVARCHAR(20))
insert #TABLE
SELECT DISTINCT CONVERT(NVARCHAR(12),a.date) AS Date
,dbo.GetWorkingHourPerDay(a.date,a.empID) as numberOFWorkingHour
,a.EMPID
,a.time
,a.FuncKey
FROM
@EmployeesTable et
LEFT JOIN PERS_Attendance a ON a.empID = et.empid
LEFT JOIN PERS_EmployeeProfile EmpP ON EmpP.ID = a.EmpID
WHERE a.Date BETWEEN @StartDate AND @EndDate
GROUP BY a.empID,a.Date,a.time,a.FuncKey
--select * FROM #TABLE order by date
DECLARE @cols AS VARCHAR(MAX)
DECLARE @query AS VARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME(cast(CONVERT(VARCHAR(20), date,103) as varchar(10)))
FROM
(
SELECT a1.date FROM (
SELECT DISTINCT date
FROM #TABLE
WHERE Date BETWEEN @StartDate AND @EndDate
)a1
) t
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1,1,'')
SET @query =
' SELECT EMPID,funckey,' + @cols + '
FROM
(
SELECT t.EMPId,convert(varchar(20), t.date,103)date,t.time,t.funckey, t.numberOFWorkingHour
FROM #TABLE t
)src
pivot
(
AVG(time)
for date in (' + @cols + ')
) p WHERE 1=1'
EXEC(@Query)
if object_id('tempdb..#TABLE') IS NOT NULL
BEGIN
DROP TABLE #TABLE
END
как я уже упоминал, тип времени не работают с шарниром, так и с что я могу заменить?
Не могли бы вы [править] Ваш вопрос и добавить некоторые образцы данных и ожидаемых результатов, пожалуйста? –
да, конечно, см. Edit –
Почему бы вам не использовать 'MAX()' вместо 'AVG()'? –