• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 63
  • Last Modified:

Joining Statement in SQL

Hi,

The following statement generates output of attendance records (from Honeywell based access control system) and Lotus Notes based workflow application pulled the information to publish the records.  

SELECT * FROM
(SELECT a.link3,
REPLACE (CONVERT(VARCHAR(11),TIMESTAMP, 106),' ', '-') new_date,
MIN(a.TIMESTAMP) AS First_in,
MAX(a.TIMESTAMP) AS Last_Out
from History a
where REPLACE (CONVERT(VARCHAR(11),TIMESTAMP, 106),' ', '-') = '29-apr-2014'
GROUP BY a.link3, REPLACE (CONVERT(VARCHAR(11),TIMESTAMP, 106),' ', '-')
) A
INNER JOIN emp_sms_email b ON a.link3 = b.CardHolderID
where b.CardNumber = '1'

Recently, we have implemented Biometrics equipments at various locations and IN/OUT of an employee is getting stored in a separate Table namely "Timewatch_attendance", which has the following four fields:

LastDate,
FirstIN,
LastOut,
EmpID  : EmpID is unique in both the case

Now, I am facing challenges in joining these two to generate a single output file, which I can finally display through Lotus Notes application.

The query should check and display First_IN & FirstIn (MIN) and Last_Out and LastOut (Max) in both the table/view and generate the output accordingly.

Can you help me please.

Regards,
0
AmitavaCh
Asked:
AmitavaCh
  • 3
  • 2
1 Solution
 
Guy Hengel [angelIII / a3]Billing EngineerCommented:
will there be the EMPID in both tables? or maybe just in either of the 2 tables?
you eventually may need a FULL OUTER JOIN...
SELECT * FROM
(SELECT a.link3,
REPLACE (CONVERT(VARCHAR(11),TIMESTAMP, 106),' ', '-') new_date,
MIN(a.TIMESTAMP) AS First_in,
MAX(a.TIMESTAMP) AS Last_Out
from History a
where REPLACE (CONVERT(VARCHAR(11),TIMESTAMP, 106),' ', '-') = '29-apr-2014'
GROUP BY a.link3, REPLACE (CONVERT(VARCHAR(11),TIMESTAMP, 106),' ', '-')
) A
INNER JOIN emp_sms_email b ON a.link3 = b.CardHolderID
JOIN Timewatch_attendance tw on tw.EmptID = ??.emp_id
where b.CardNumber = '1' 

Open in new window

0
 
AmitavaChAuthor Commented:
Field 'EmpID' exists in both the table.

Since EmpID is common, query to check whether the person marked his presence at Office location or site location, similarly while leaving.

E.g. Today, I come to office and marked my presence through HID Based Card in the morning at 9:45 a.m. and left at 12:30 for our site. At 1:30 I  swiped my finger at Biometric machines and finally at 7:00 p.m. and left from there, next day my FirstIN will be 9:45 a.m. and lastOut will be at 7:00 p.m. (which is currently stored in Timewatch_attendance table).

Thank you
0
 
SharathData EngineerCommented:
Provide some sample data and expected result.
What is your SQL Server version?
0
What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

 
AmitavaChAuthor Commented:
Hi,
Enclosed please find the sample data and expected result.
I am using SQL Server 2005 STD.

Thank you,
EE-Solution.pptx
EE-Solution.xlsx
0
 
AmitavaChAuthor Commented:
Hi Hengel,

Yes, Full Outer Join is required - I also need to extract Min & Max time once again to get the desired result.

SELECT * FROM
(SELECT a.link3,
REPLACE (CONVERT(VARCHAR(11),TIMESTAMP, 106),' ', '-') new_date,
MIN(a.TIMESTAMP) AS First_in,
MAX(a.TIMESTAMP) AS Last_Out
from History a
where REPLACE (CONVERT(VARCHAR(11),TIMESTAMP, 106),' ', '-') = '29-apr-2014'
GROUP BY a.link3, REPLACE (CONVERT(VARCHAR(11),TIMESTAMP, 106),' ', '-')
) A
INNER JOIN emp_sms_email b ON a.link3 = b.CardHolderID
FULL OUTER JOIN TimeWatch_Attendance ON b.EmpID=TimeWatch_Attendance.Emp_Code
where b.CardNumber = '1';

The above query is giving me all the entries (dates) of Biometrics for Card # '1', however, I need the record only for 29-apr-2014 i.e. today-1
0
 
Guy Hengel [angelIII / a3]Billing EngineerCommented:
FULL OUTER JOIN TimeWatch_Attendance ON b.EmpID=TimeWatch_Attendance.Emp_Code
where b.CardNumber = '1';

should then be

FULL OUTER JOIN TimeWatch_Attendance ON b.EmpID=TimeWatch_Attendance.Emp_Code
AND b.CardNumber = '1'
and b.LastDate >= convert(date, getdate()-1)
and b.LastDate < convert(date, getdate())
;
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now