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

استعرض أسماء الموظفين الذين عدد حروفهم متساوية


السيد النمر

Recommended Posts

السلام عليكم ورحمة الله وبركاته

إخواني الاعزاء

في الاسكيما الخاصة بالمستخدم SCOTT

أريد استعراض أسماء الموظفين الذين عدد حروف أسمائهم متساوية

لقد وصلت لهذا الحل وهو ناقص بالتأكيد

select a.ename , length(a.ename)
from emp a , emp b
where length(a.ename) = length(b.ename) and a.empno = b.mgr



وأخرج لي هذه النتيجة

ENAME LENGTH(A.ENAME)
---------- ---------------
BLAKE 5
JONES 5
SCOTT 5
BLAKE 5

بالطبع الحل ناقص

أرجو الحل من حضرتكم وشكرا

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

السلام عليكم...

1  select ename,length(ename) from emp where length(ename) in 2  (select length(ename) from emp where ename is not null
 3*  group by length(ename)  having count(*)>1)
SQL> /

ENAME      LENGTH(ENAME)
---------- -------------
MILLER                 6
TURNER                 6
MARTIN 6
JAMES                  5
ADAMS                  5
SCOTT                  5
CLARK                  5
BLAKE                  5
JONES                  5
ALLEN                  5
SMITH                  5

ENAME      LENGTH(ENAME)
---------- -------------
FORD                   4
KING                   4
WARD                   4

14 rows selected.
رابط هذا التعليق
شارك

جزاكم الله خيرا على تعاونك

اظن أن ايضا هذا الحل ياتي بنفس النيجة

SELECT ENAME , LENGTH(ENAME) 
FROM EMP ORDER BY LENGTH(ENAME)




أريد أن اقسم الأسماء المتشابهه في عدد حروفها على هيئة أعمدة

بان ياتي بالاسماء التي عدد حروفها 4 حروف في عمود ، والاسماء التي عدد حروفها 5 حروف في عمود ، وهكذا

ارجو الرد

وجزاكم الله خيرا

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

جزاكم الله خيرا على تعاونك

SELECT ENAME , LENGTH(ENAME) 
FROM EMP ORDER BY LENGTH(ENAME)




أريد أن اقسم الأسماء المتشابهه في عدد حروفها على هيئة أعمدة

بان ياتي بالاسماء التي عدد حروفها 4 حروف في عمود ، والاسماء التي عدد حروفها 5 حروف في عمود ، وهكذا

ارجو الرد

وجزاكم الله خيرا



لا أظن أن هذا الحل سياتي بنفس النيجة لأنك استخدمت فقط
ORDER BY وهي تعمل فقط على أعادة الترتيب قم بإضافة سجل جديد وانت ستلاحظ الفرق
رابط هذا التعليق
شارك

الهدف كان استعراض اسماء الموظفين التي حروف اسمائهم متساوية

اريد الان ان اجعل كل عدد حورق متاشبهه في عمود بهذا الشكل

length 4 length5
-----------------
ADAMS
SCOTT
CLARK
BLAKE
JONES
ALLEN
SMITH
WARD

وهكذا

وشكرا

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

أخي الكريم...
بالنسبة لأي سؤال نريد فيه التحكم بقيم الأعمدة فيجب تحديد عدد الأعمدة المراد إنشائه
فمثلاً في مثالك يجب تحديد عدد الأحرف الأعظمي الممكن تواجده في الجدول , بعد هذه المرحلة سوف تقوم باستخدام case or decode و تكراره بعدد الأعمدة
لذلك فإن تنفيذها باستخدام الاستعلام هي في الواقع غير ديناميكية...
إن أردت تحديد عدد الأعمدة .. استطيع مساعدك

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

الموجود في جدول EMP ثلاث مجموعات من الحروف

موظفين عدد حروف أسمائهم 4 حروف

وموظفين عدد حروف اسمائهم 5 حروف

وموظفين عدد حروف اسمائهم 6 حروف

هل هذا قصدك أن احدد لك عدد الاعمدة ثم ستقوم بالعمل على دالة DECOD او CASE من خلال الاستعلام الفرعي في جزء FROM

ألا يوجد حل أخر يجعلني اقسم الاسماء المتساوية في عدد الحروف على شكل اعمدة من خلال الاستعلام

أرجو المشاركة وطرح الحلول

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

أعتقد أخ نمر


يجب أن تحدد عدد الأحرف لتتمكن من إضافة الأعمدة وذلك بالعمل على دالة DECOD او CASE
مثال :
SELECT ENAME,LENGTH(ENAME) ,CASE WHEN LENGTH(ENAME)=4 THEN ENAME ELSE NULL END "4",CASE WHEN LENGTH(ENAME)=5 THEN ENAME ELSE NULL END "5",
CASE WHEN LENGTH(ENAME)=6 THEN ENAME ELSE NULL END "6"
FROM EMP ORDER BY LENGTH(ENAME) ;[/center]

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

شاكر أخي جود على ردك

لكن لو كان الأمر كذلك يمكنني استخدام المتغيرات البديلة

select decode (length(ename) , &L,ename) names from emp



ألا يوجد طريقة أخرى في الاستعلام ياتي بالأسماء بدون اللجوء الى طريقة كتابة عدد الحروف

شكرا لك من فكر وساعدني

ارجو مشاركة الخبراء

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

يا اخ السيد النمر هذا ما استطعت التوصل إليه فارجو منك او من الاخوه الاعضاء ان يحوال
احد منكم بإزالة الخانات الفاضية حتى يكون المثال قد اكتمل . وبالنسبه إلى عدم ظهور الارقام في الاستعلام
فهذي يا خوي من لقيتلها حل وإذا لقيت حاجه نرجو منك تشاركنا فيها


select decode(length(ename),4,ename) for_lnth,
      decode(length(ename),5,ename) fif_lnth,
      decode(length(ename),6,ename) sex_lnth
from emp where length(ename) in (select length(ename)
		from emp group by length(ename));

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

جزاك الله خيرا يا أخ colla

بس الامر كما قدمه الاخ جود
وتبقى فكرة المتغيرات البديلة أفضل من أن نكتب أرقام لعدد حروف الأسماء

نريد طريقة نقسم بها عدد حروف الأسماء دون اللجوء الى ادخال ارقام سواء كان في الاستعلام أو بعد تنفيذ الاستعلام من خلال المتغيرات البديلة

نرجو الرد من المتخصصين

وشكرا لكل المشاركين

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

select decode (length(ename) , &L,ename,length(ename) ) names from emp



هذا أخر ما وصلت إليه من خلال المتغيرات البديلة
إذا قمت بالضغط على رقم 5 مثلا

NAMES
---------
SMITH
ALLEN
4
JONES
6
BLAKE
CLARK
SCOTT
4
6
ADAMS

NAMES
---------
JAMES
4
6



إذا ضغطت على رقم غير موجود كعدد حروف في الجدول مثلا كرقم 3

NAMES
-------------------
5
5
4
5
6
5
5
5
4
6
5

NAMES
-------------------
5
4
6

14 rows selected.



أظن الطريقة واضحة

لكن أعتقد أن هناك أفضل من هذا

اتمنى مشاركة الناس معانا

وفقكم الله

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

انا عندى حل وان شاء الله يكون كويس وينفعك
دى جمله سيليكت هتطلع اسماء كل الموظفين مترتبين وكل مجموعه حروفهم متساويه مع بعض
وانا عملت مثال على last-name فى جدول emplpyees
وانت طبعا ممكن تطبق على اى جدول تانى
ودى جمله السيليكت
select last_name , length (last_name) len ------- هنا طبعا بنعمل سيليكت لــ last_name و طول حروف الــ last_name وسميت العمود هنا len
from employees --------- هنا طبعا السيليكت من جدول الــ employees
where length (last_name) = length (last_name) ------- هنا شرط السيليكت وهو مساواه الحروف ببعض
order by len -------- وهنا انا رتبت الاسماء الى هتطلع علشان يبقى كل مجموعه مع بعض يعنى الى عدد حروفهم 3 وبعدين وراهم الى عدد حروفهم 4 وهكذا ....

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

يا ريت اكون قدرت افهم قصدك واكون عرفت اساعدك وياريت ترد عليا تقولى فكرت البسيطه نفعتك ولا لا
وشكرا ليك وللمنتدى الجميل

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

مشاركة طيبة منك يا اخ m_mm622

وهذا هو الحل الذي ذكرته بطريقة أوضح حتى يستفيد من يراه

select first_name , length(first_name) 
from employees where length(first_name) = length(first_name) 
order by length(first_name)



لكن يا اخي هذا الحل قد عرض قبل ذلك في المشاركات السابقة لو راجعته

المطلوب ان تكون هذه هي النتيجة ولكن دون استخدام أرقام ، او متغيرات بديلة



FOR_LNTH 	FIF_LNTH 	SEX_LNTH
 	  	MILLER
 	  	TURNER
 	  	MARTIN JAMES 	 
 	ADAMS 	 
 	SCOTT 	 
 	CLARK 	 
 	BLAKE 	 
 	JONES 	 
 	ALLEN 	 
 	SMITH 	 
FORD 	  	 
KING 	  	 
WARD 	  	 

14 rows selected.

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

ده حل بردو




select ename,length(ename) from emp 
where length(ename) in  (select length(ename) 
								from emp where 
								ename is not null
								 group by length(ename)
								  having count(*)>1)
ORDER BY LENGTH(ENAME)
تم تعديل بواسطة she2005
رابط هذا التعليق
شارك

بس حد يعرف يطلع حل السؤال ده

فى اعمده

بحيت ان كل عمود كل الاسماء اللى فيه متساويه

بمعنى عمود للاسماء اللى عدد حروفها 6

و هكذا

مش عارف اوصله خالص للاسف :)

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

يا أخ she2005 لو كنت رجعت للمشاركات السابقه في الموضوع دا كنت لقيت انو انا قربت شويه من الحل
ووضعت كل الاسماء الي عدد حروفها متساويه في الرقم في عمود خاص . وانا متابع الموضوع دا كويس
فانا ارجو من الاعضاء المساعده في هذا الموضوع .

وكمان راح اكتب لك الكود مره ثانيه مع شويه زيادات بسيطه :

الحل السابق :

select decode(length(ename),4,ename) for_lnth,
      decode(length(ename),5,ename) fif_lnth,
      decode(length(ename),6,ename) sex_lnth
from emp where length(ename) in (select length(ename)
from emp group by length(ename))




الحل الجديد مع عرض الاسماء كامله وطول كل إسم :
عند مراجعتي للمشاركات السابقه وجدت احد الاعضاء قد وضع حل قريب من هذا الحل في الناتج النهائي :
بمعنى الناتج هو نفسه الناتج لكن الطريقه اختلت قليلا :

select ename, length(ename) len_gth, decode(length(ename),4,ename) for_lnth,
			     decode(length(ename),5,ename) fif_lnth,
		             decode(length(ename),6,ename) sex_lnth
from emp where length(ename) in (select length(ename)
from emp group by length(ename))

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

  • بعد 2 أسابيع...

يا اخ السيد النمر ارجو ان يكون هذا الحل مناسبا معك :


create or replace view names
as select decode(length(ename),4,ename) for_lnth,
      decode(length(ename),5,ename) fif_lnth,
      decode(length(ename),6,ename) sex_lnth
from emp where length(ename) in (select length(ename)
                       from emp group by length(ename));



select * from (select for_lnth, rownum rown from names where for_lnth is not null) a,
(select fif_lnth, rownum rown from names where fif_lnth is not null) b,
(select sex_lnth, rownum rown from names where sex_lnth is not null) c
where a.rown=b.rown and a.rown=c.rown;



وارجو من الاخوه الخبراء الافتاء

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

تمام كلام جميل يا اخ colla

بس المفروش ان انت تكتب الكود من غير ما تكتب اى ارقام

انت بعد كده هتشتغل على داتابيز كبيره جدا

فا مينفعش تبنى حلك على ارقام

انا شايف كده من وجهة نظرى

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

بما انه في هذة الحالة يكون عدد الاعمدة متغير حسب اطوال الاسماء الموجودة في الجدول لذلك
أقترح حلا وسط ;)

بعمل procedure
صغير مع view

كالتالي

CREATE OR REPLACE PROCEDURE ppp_ppp IS
cursor g is select length(ename) x  from emp group by length(ename);
b varchar2(500);
begin for i in g loop
    b:=b||','||'decode(length(ename),'||i.x||',ename) a'||i.x;

 end loop;
b:=substr(b,2);
execute immediate 'create or replace view zzzz as select '||b||' from emp'; end;



ثم نقوم بالاستعلام عن الفيو


select * from zzzz;



تحياتي

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

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

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

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

×   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.

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

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

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