2010-09-07 3 views
0

Я должен создать отчет в следующем формате:Невозможно создать свой отчет

staffcode Имя dateintime dateoutime Продолжительность

, например:

Staffcode Имя 01-08- 2010intime 01-08-20100uttime 01-08-2010duration

1001 Amit 09:00 18:30 09:30

В SQL Studio для управления сервером в течение 5 дней я написал запрос, как этот

Declare @intime table 
(
Staffcode varchar(7), 
Name varchar(100), 
[01-08-2010 InTime] datetime, 
[02-08-2010 InTime] datetime, 
[03-08-2010 InTime] datetime, 
[04-08-2010 InTime] datetime, 
[05-08-2010 InTime] datetime 
) 

Declare @outtime table 
(
Staffcode varchar(7), 
Name varchar(100), 
[01-08-2010 outTime] datetime, 
[02-08-2010 outTime] datetime, 
[03-08-2010 outTime] datetime, 
[04-08-2010 outTime] datetime, 
[05-08-2010 outTime] datetime 
) 

Declare @Duration table 
(
Staffcode varchar(7), 
Name varchar(100), 
[01-08-2010 Duration] datetime, 
[02-08-2010 Duration] datetime, 
[03-08-2010 Duration] datetime, 
[04-08-2010 Duration] datetime, 
[05-08-2010 Duration] datetime 
) 

Insert into @Intime 
SELECT 
StaffCode, 
Name, 
[01-08-2010] as [01-08-2010], 
[02-08-2010] as [02-08-2010], 
[03-08-2010] as [03-08-2010], 
[04-08-2010] as [04-08-2010], 
[05-08-2010] as [05-08-2010] 
FROM 
(
SELECT 
StaffCode, 
Name, 
CONVERT(VARCHAR(10),AttendanceDate,105) AttendanceDate, 
CONVERT(VARCHAR(5),MIN(FirstPunch),108) InTime 
FROM AttendanceLog 
JOIN Staff on Staff.Id = AttendanceLog.StaffId 
WHERE AttendanceDate BETWEEN '2010-08-01' And '2010-08-05' 
AND Staffcode BETWEEN '10001' AND '10999' 
AND name <>'' and workstatus = 'Is Working' 
GROUP BY 
name,StaffCode,AttendanceDate 
)p 

PIVOT 
(
    MIN(InTime) 
    FOR AttendanceDate 
    IN 
(
[01-08-2010], 
[02-08-2010], 
[03-08-2010], 
[04-08-2010], 
[05-08-2010] 
) 
)AS pvt 


Insert into @Outtime 

SELECT 
StaffCode, 
Name, 
[01-08-2010] as [01-08-2010], 
[02-08-2010] as [02-08-2010], 
[03-08-2010] as [03-08-2010], 
[04-08-2010] as [04-08-2010], 
[05-08-2010] as [05-08-2010] 
FROM 
(
SELECT 
StaffCode, 
Name, 
CONVERT(VARCHAR(10),AttendanceDate,105) AttendanceDate, 
CONVERT(VARCHAR(5),MAX(LastPunch),108) OutTime 
FROM AttendanceLog 
JOIN Staff on Staff.Id = AttendanceLog.StaffId 
WHERE AttendanceDate BETWEEN '2010-08-01' And '2010-08-05' 
AND Staffcode BETWEEN '10001' AND '10999' 
AND name <>'' and workstatus = 'Is Working' 
GROUP BY 
name,StaffCode,AttendanceDate 
)p 

PIVOT 
(
    MAX(OutTime) 
    FOR AttendanceDate 
    IN 
(
[01-08-2010], 
[02-08-2010], 
[03-08-2010], 
[04-08-2010], 
[05-08-2010] 
) 
)AS pvt 

Insert into @Duration 

SELECT 
StaffCode, 
Name, 
[01-08-2010] as [01-08-2010], 
[02-08-2010] as [02-08-2010], 
[03-08-2010] as [03-08-2010], 
[04-08-2010] as [04-08-2010], 
[05-08-2010] as [05-08-2010] 
FROM 
(
SELECT 
StaffCode, 
Name, 
CONVERT(VARCHAR(10),AttendanceDate,105) AttendanceDate, 
CONVERT(VARCHAR(5),(MAX(LastPunch) - MIN(FirstPunch)),114) Duration 
FROM AttendanceLog 
JOIN Staff on Staff.Id = AttendanceLog.StaffId 
WHERE AttendanceDate BETWEEN '2010-08-01' And '2010-08-05' 
AND Staffcode BETWEEN '1001' AND '1999' 
AND name <>'' and workstatus = 'Is Working' 
GROUP BY 
name,StaffCode,AttendanceDate 
)p 

PIVOT 
(
    MAX(Duration) 
    FOR AttendanceDate 
    IN 
(
[01-08-2010], 
[02-08-2010], 
[03-08-2010], 
[04-08-2010], 
[05-08-2010] 
) 
)AS pvt 

Select 

I.StaffCode, 
I.Name, 
CONVERT(VarCHAR(5),[01-08-2010 InTime],114) [01-08-2010 InTime], 
CONVERT(VarCHAR(5),[01-08-2010 OutTime],114) [01-08-2010 OutTime], 
CONVERT(VarCHAR(5),[01-08-2010 Duration],114)[01-08-2010 Duration], 
CONVERT(VarCHAR(5),[02-08-2010 InTime],114)  [02-08-2010 InTime], 
CONVERT(VarCHAR(5),[02-08-2010 OutTime],114) [02-08-2010 OutTime], 
CONVERT(VarCHAR(5),[02-08-2010 Duration],114)[02-08-2010 Duration], 
CONVERT(VarCHAR(5),[03-08-2010 InTime],114)  [03-08-2010 InTime], 
CONVERT(VarCHAR(5),[03-08-2010 OutTime],114) [03-08-2010 OutTime], 
CONVERT(VarCHAR(5),[03-08-2010 Duration],114)[03-08-2010 Duration], 
CONVERT(VarCHAR(5),[04-08-2010 InTime],114)  [04-08-2010 InTime], 
CONVERT(VarCHAR(5),[04-08-2010 OutTime],114) [04-08-2010 OutTime], 
CONVERT(VarCHAR(5),[04-08-2010 Duration],114)[04-08-2010 Duration], 
CONVERT(VarCHAR(5),[05-08-2010 InTime],114)  [05-08-2010 InTime], 
CONVERT(VarCHAR(5),[05-08-2010 OutTime],114) [05-08-2010 OutTime], 
CONVERT(VarCHAR(5),[05-08-2010 Duration],114)[05-08-2010 Duration] 
From @Intime I 
JOIN @Outtime O on I.StaffCode=O.StaffCode 
JOIN @Duration D on I.StaffCode=D.Staffcode 
order by Staffcode 

Из этого запроса я получаю Интайм, outtime и продолжительность для всех сотрудников, кто работает в моей компании ..

Я Сгенерированный отчет за эти 5 дней также ..

Но теперь я хочу, чтобы сгенерировать отчет для п количества дней ...

для этого мне нужно сделать.

Но я хочу, чтобы все даты в столбце только ..

Пожалуйста, кто-нибудь сказать мне, что делать для этого ...

Пожалуйста, скажите мне, что мне нужно изменить в запросе ???

Я работаю с SQL Server 2005 .. Еще одна вещь, я считаю, что нужно использовать в то время как петля ... Но я путаю, как использовать и где использовать .. , потому что я новичок в этой области ..

Благодарности & Привет

ответ

1

Прежде всего, вам не нужны три таблицы для «инверсию», «амбулаторном» времени и продолжительности. Вам нужен только тот, который будет включать эти данные в один CTE.

Затем вы хотите сгенерировать для заданного промежутка времени массив дней в формате varchar.

declare @from datetime = '20100901', @to datetime = '20100910' 
;with Calendar as 
(
    SELECT CAST(@from as datetime) AS [date] 
    UNION ALL 
    SELECT DATEADD(dd, 1, [date]) 
    FROM Calendar 
    WHERE DATEADD(dd, 1, [date]) <= @to 
) 
SELECT substring(convert(varchar, [date], 121), 1, 10) Day 
FROM Calendar c 
OPTION (MAXRECURSION 0); 

Тогда вы бы собрать эти дни в одну строку и вставить его в тех местах, где вы используете эти даты в коде SQL.

Тогда вы запустите этого монстра запроса с помощью команды exec.

На боковой ноте. Все это круто, чтобы использовать sql для этой задачи, но лично я бы установил построитель отчетов и построил этот отчет из плоских данных, которые у вас есть, и там есть всевозможные функции агрегации, которые вы не можете легко имитировать, используя только sql без каких-либо вспомогательных функций.

Обновление. Here is an actual implementation of a dynamic pivot.