الانتقال إلى المحتوى

لغز محير لخبراء Sql


mageed_ahmed

Recommended Posts

السلام عليكم ورحمة الله وبركاته
برجاء التكرم بقراءة المعطيات التالية والمساعدة في اعطاء الناتج من خلال
sql statement or pl code

SQL> select emp_code,to_char(dated,'dd/mm/yyyy') dated,inout from ATD
2 order by emp_code,dated,INOUT;

EMP_ DATED INOUT
---- ---------- --------
0085 20/10/2007 08:09:27
0085 20/10/2007 12:58:30
0085 20/10/2007 14:08:32
0085 20/10/2007 18:00:04
0085 21/10/2007 08:10:02
0085 21/10/2007 12:56:53
0085 21/10/2007 14:07:38
0085 21/10/2007 18:44:44
0085 22/10/2007 08:12:34
0085 22/10/2007 13:11:57
0085 22/10/2007 14:08:33
0085 22/10/2007 18:11:58
0086 23/10/2007 08:12:00
0086 23/10/2007 13:00:05
0086 23/10/2007 14:05:48
0086 23/10/2007 18:04:42
0086 24/10/2007 08:13:35
0086 24/10/2007 13:06:17
0086 24/10/2007 14:11:06

20 rows selected.

the required is to make a select statement which results the following

EMP_code DATED INOUT1 INOUT2 INOUT3 INOUT4
0085 20/10/2007 08:09:27 12:58:30 14:08:32 18:00:04
0085 21/10/2007 08:10:02 12:56:53 14:07:38 18:44:44
AND SO ON TO SHOW DAY ONE TIME WITH THE 4 TIMES FOR EVERY EMPLOYEE

YOU are allowd to give any solution to get the result

FOR MORE INFORMATION

CREATE TABLE ATD(EMP_CODE VARCHAR2(4),DATED DATE,INOUT DATE);
THEN INSERT THESE VALUES INSIDE THIS TABLE LIKE

INSERT INTO ATD VALUES ('0085' ,TO_DATE('20/10/2007','DD/MM/YYYY'),TO_DATE('08:09:27','HH24:MI:SS'));
INSERT INTO ATD VALUES ('0085' ,TO_DATE('20/10/2007','DD/MM/YYYY'),TO_DATE('12:58:30','HH24:MI:SS'));
INSERT INTO ATD VALUES ('0085' ,TO_DATE('20/10/2007','DD/MM/YYYY'),TO_DATE('14:08:32','HH24:MI:SS'));
INSERT INTO ATD VALUES ('0085' ,TO_DATE('20/10/2007','DD/MM/YYYY'),TO_DATE('18:00:04','HH24:MI:SS'));
AND SO ON FOR INSERTING THE ABOVE DATA

THEN YOU CAN USE the following to display date and time as I listed before

SQL> select emp_code,to_char(dated,'dd/mm/yyyy') dated,inout from ATD
2 order by emp_code,dated,INOUT;

I hope you reply it.

to get this data in text file please download the attached file

to_araboracle.txt

تم تعديل بواسطة mageed_ahmed
رابط هذا التعليق
شارك

الحل كالتالي باستخدام NESTED CURSOR

DECLARE
 INOUT_TEMP VARCHAR2(80) :='';
 CURSOR C1 IS
SELECT DISTINCT EMP_CODE, TO_CHAR(DATED, 'DD/MM/YYYY') DATED
  FROM ATD
 ORDER BY 1, 2;

 CURSOR C2(E_CODE IN VARCHAR2, DAT VARCHAR2) IS
SELECT TO_CHAR(INOUT, 'HH24:MI:SS') INOUT
  FROM ATD
 WHERE EMP_CODE = E_CODE
   AND TO_CHAR(DATED,'DD/MM/YYYY') = DAT
 ORDER BY 1;
BEGIN
 FOR I IN C1 LOOP
FOR J IN C2(I.EMP_CODE , I.DATED) LOOP
  INOUT_TEMP := INOUT_TEMP||' '||J.INOUT;
END LOOP;
DBMS_OUTPUT.PUT_LINE(I.EMP_CODE||' '||I.DATED||INOUT_TEMP);
INOUT_TEMP := '';
 END LOOP;
END;



اتمنى ان يكون المطلوب وما توفيقي الا بالله

رابط هذا التعليق
شارك

جزاكم الله خيرا الجزاء وبارك فيك وجعله في ميزان حسانتك

الفكرة واضح أنها صحيحة وشيقة جدا وعلي أي حال جاري التجربة

بارك الله فيك وأصلح حالك

رابط هذا التعليق
شارك

أخي الفاضل
بالنظر الي
EMP_ DATED INOUT
---- --------- --------
0992 20-OCT-07 17:31:34
0992 20-OCT-07 08:06:38
0992 21-OCT-07 08:02:36
0992 21-OCT-07 17:29:55
0992 22-OCT-07 07:54:28
0992 22-OCT-07 17:30:41
0992 23-OCT-07 07:59:09
0992 23-OCT-07 17:30:35


حينما يصل الكود الي الصف الاخير 0992 24-OCT-07 07:58:29 للموظف 0992 فانه يعطي ORA-6502

رابط هذا التعليق
شارك

بمعني اذا كان INOUT ظاهر مرة واحدة كأن كان حضور الموظف مرة واحدة في اليوم يعطي رسالة الخطأ يعني الكود الذي تفضلت به يحتاج INOUT مدخلين للموظف في يوم واحد

رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية