2010-09-07 4 views
0

Je dois générer un rapport dans ce format:Impossible de générer mon rapport

staffcode Nom dateintime dateoutime Durée

par exemple:

Staffcode Nom 01-08- 2010intime 01-08-20100uttime 01-08-2010duration

1001 Amit 09:00 18:30 09:30

en studio de gestion de serveur sql pendant 5 jours, je demande par écrit comme ceci

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 

De cette requête je reçois INTIME, outtime et la durée pour tous les employés qui travaillent dans mon entreprise ..

J'ai généré rapport pour ces 5 jours aussi ..

Mais maintenant, je veux générer un rapport pour un nombre n de jours ...

pour ce que je dois faire.

Mais je veux que toutes les dates dans la colonne seulement ..

S'il vous plaît quelqu'un me dire ce qu'il faut faire pour cela ...

S'il vous plaît me dire ce que je dois changer dans la requête ???

Je travaille avec le serveur SQL 2005 .. une chose que je pense que nous devons utiliser while ... Mais je confondez comment utiliser et où utiliser .. parce que je suis nouveau dans ce domaine ..

Merci & Cordialement

Répondre

1

tout d'abord, vous n'avez pas besoin de trois tables pour le temps et la durée « in- », « hors ». Vous en avez seulement besoin qui incorporerait ces données dans un seul CTE.

Ensuite, vous voudriez générer pour un laps de temps donné un tableau de jours au format 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); 

Ensuite, vous assembler ces jours dans une seule chaîne et l'insérer dans les endroits où vous utilisez ces dates dans le code sql.

Ensuite, vous exécuteriez ce monstre d'une requête en utilisant la commande exec.

Sur une note de côté. C'est génial d'utiliser sql pour cette tâche, mais personnellement j'installerais Report Builder et compilerais ce rapport à partir de données à plat que vous avez et il y a toutes sortes de fonctions d'agrégation disponibles que vous ne pouvez pas facilement imiter en utilisant juste sql sans aucune fonction d'aide.

Mise à jour. Here is an actual implementation of a dynamic pivot.

Questions connexes