PDA

View Full Version : گزینش از 3 تیبل با شرط مقدار طول و شباهت



Sal_64
پنج شنبه 17 بهمن 1387, 13:01 عصر
سلام

به همه مهندسین عزیز



من 3 تا تیبل دارم



Tabel1 : 1code

Tabel2 : code2,name,family

Tabel3 :code3,money,mah,sal



قراره از تیبل دوم نام و فامیل و کد2 استخراج شه و از تیبل سوم مجموع پول در ماه و سال خاص

با شرط اینکه 5 رقم اول کد3 با کد1 برابر باشه

و تمام ارقام کد2 شبیه به ارقام اولیه کد 3 باشه

با احتساب اینکه کدها حاوی کاراکتر هستند و به صورت varchar ذخیره شدند

و اینکه

Len(code1) < len(code2) < len(code3)


تقریبا چیزس شبیه شبه کد زیر



select tabel2.cod2,tabel2.name,tabel2.family,sum(money)
from tabel1,tabel2,tabel3
where tabel3.code3 in left(tabel1.code1,5)
and tabel3.code3 like tabel2.code2+'%'
...
میشه راهنمایی کنید ، چه شکلی باید کاملش کنم ؟؟ :بوس::افسرده:

با تشکر

حامد مصافی
پنج شنبه 17 بهمن 1387, 13:07 عصر
خب در این زمینه کارهای زیادی می تونی انجام بدی اما اصولی ترین راه اینه که در table3 فیلد جدیدی که FK و مرتبط به table2.code2 باشد ایجاد کنید که شامل 5 کاراکتر کد باشد و یک فیلد جدید با نام SubCode ایجاد کنید که شامل بقیه کاراکتر های کد باشد. بدین ترتیب هنگام پرس و جو به طور صحیح با یک JOIN می تونید اطلاعات رو استخراج کنید و سپس همین کار رو در مورد code1 و code2 انجام بدید.

Itist82
پنج شنبه 17 بهمن 1387, 14:13 عصر
با جواب نفر قبلی موافقم. در طراحی پایگاه داده اگه اشتباه نکنم توی نرمال فرم اول می گن فیلد ها رو جوری نگیر که مجبور باشی از بخشی از یه فیلد استفاده کنی. خوب جدا کنید، این راحت ترین کاره.

Sal_64
پنج شنبه 17 بهمن 1387, 16:07 عصر
سلام


خب در این زمینه کارهای زیادی می تونی انجام بدیببینید
طراحی این تیبل ها با من نبوده و امکان اضافه کردن فیلد جدید هم وجود نداره
از این که بگذریم

کاری انجام دادم به شرح زیر

با دستوری شبیه به دستور، پست اول فیلدهای tabel3 که در شروط صدق می کردند رو برداشتم

حالا چطور بهش بفهمونم در ماه و سال خاص
مجموع money که با کد2 در تیبل 2 برابر است رو محاسبه کنه

مثال عددی زیر رو ببینید

کد 2 در تیبل 2 برابر : 15-26
کدهای 3 در تیبل 3 برابر با : 151-26 و 150-26 و 1512-26 و .....

رکورد حاصل

رضا - اکبری - 15-26 - 125000

و همینطور برای باقی کدهای2 موجود در تیبل 2


اگه توضیحات بیشتری نیازه بفرمایید


با تشکر :بوس:

Sal_64
جمعه 18 بهمن 1387, 11:59 صبح
سلام

به مهندسین و دوستان عزیز

جواب سوال فوق کمی ضروری :افسرده:

اگه جواب کامل رو هم در حال حاضر نمی دونید
فرضیات و یا راهنمایی های کوچک هم می تونه مفید باشه :بوس:


با تشکر

AminSobati
جمعه 18 بهمن 1387, 17:21 عصر
دوست عزیزم با توجه به عدم امکان تغییر در ساختار، پس بحث در مورد Normalization جایی نداره. همون Join و Aggregation انجام بدین

Itist82
شنبه 19 بهمن 1387, 12:41 عصر
سلام
تا جایی که براتون ممکنه سعی کنید ساختار پایگاه داده رو تغییر بدید، کار کردن با دیتابیسی که مشکل ساختاری داره روان آدمو پریشان می کنه!
اگه نخواهید تغییر بدید و اگه توابع زبان اس کیو ال برای کار با رشته و جدا کردن بخشی از یه رشته توی شرط کار کنه که الان مطمئن نیستم، می تونید با اون کار کنید. اگه توضیح بیشتر ندادم به این خاطر بوده که از وجود همچین توابعی مطمئن نبودم. الان سرچ کردم (توی گوگل زدم substring SQL) و اولین لینکش جالب بود:
http://www.1keydata.com/sql/sql-substring.html
یه نگاهی بندازید. ببخشید خیلی وقت ندارم کامل جواب بدم.

Arghavan_Reza
یک شنبه 20 بهمن 1387, 11:54 صبح
از جداول table2 و table3 دو تا view بسازید که code ها در آن تجزیه شده باشند و بعد بجای استفاده از جداول از view ها استفاده کنید.

AminSobati
یک شنبه 20 بهمن 1387, 14:08 عصر
روش بالا از نظر Performance تفاوتی ایجاد نمیکنه مگر از لحاظ سهولت کار تصمیم به ساخت View بگیرین

Sal_64
دوشنبه 21 بهمن 1387, 12:48 عصر
سلام

به همه دوستان عزیز که سعی در حل این مسئله دارند



با استفاده از دستور substring که دوست عزیز جناب Itist82 پیشنهاد دادند

مسئله رو حل کردم


البته sql من 2005 و دستور SUBSTR رو داخلش پیدا نکردم




اما سوال دیگه ای پیش اومد اونهم زمانی که از چند دستور select بخوام استفاده کنم

کد صحیح رو ببینید



select tabel2.code2 ,tabel2.name,tabel2.family, sum(tabel3.money)
from tabel2,tabel3
where substring(tabel3.code3,1,len(tabel2.code2))=tabel2 .code2 and mah='04' and sal='84'
group by tabel2.code2 ,tabel2.name,tabel2.family


زمانی که بخوام برای چند تاریخ خاص مجموع پول رو حساب کنم می بایست از چند دستور select استفاده کنم که خطا


select tabel2.code2 ,tabel2.name,tabel2.family,

(select tabel2.code2, sum(tabel3.money) from tabel2,tabel3
where substring(tabel3.code3,1,len(tabel2.code2))=tabel2 .code2 and mah='04' and sal='84'
group by tabel2.code2)as sum1,

(select tabel2.code2,sum(tabel3.money) from tabel2,tabel3
where substring(tabel3.code3,1,len(tabel2.code2))=tabel2 .code2 and mah='11' and sal='84'
group by tabel2.code2) as sum2

...

group by tabel2.code2 ,tabel2.name,tabel2.familyخطا

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.مشکل کجاست
و چطور کد دوم رو تصحیح کنم ؟

با تشکر

Arghavan_Reza
دوشنبه 21 بهمن 1387, 14:20 عصر
همانطور که قبلا گفتم از view استفاده کنید کار بسیار ساده تر می شود :


CREATE VIEW vTable3
AS
SELECT Table2.*, Table3.*
FROM Table2
INNER JOIN Table3
ON SubString(Tabel3.Code3, 1, Len(Tabel2.Code2)) = Tabel2.Code2

در اینصورت مشکل خطای فوق را هم بدلیل سادگی و مفهوم بودن نخواهید داشت.

Sal_64
دوشنبه 21 بهمن 1387, 16:50 عصر
سلام



جناب Arghavan_Reza تشکر



بنده با دستورات پست 11 view رو ایجاد کردم اما دوباره به مشکل بر خوردم

امکان داره

شما با فرض اینکه view فوق ساخته شده

کدهای دوم پست 10 رو بازنویسی کنید



با تشکر:قلب:

Arghavan_Reza
چهارشنبه 23 بهمن 1387, 09:47 صبح
SELECT Code2, Name, Family, SUM(Money)
FROM vTable3
WHERE Mah = '04' AND Sal = '84' OR
Mah = '11' AND Sal = '84'
GROUP BY Code2, Name, Family

Sal_64
چهارشنبه 23 بهمن 1387, 11:05 صبح
سلام

تشکر


اما منظور از استفاده چند دستور select جهت گرفتن sum
ایحاد چند ستون با مبالغ متفاوت می باشد


با تشکر

Arghavan_Reza
چهارشنبه 23 بهمن 1387, 12:16 عصر
SELECT Code2, Name, Family,
SUM(CASE WHEN Mah = '04' AND Sal = '84' THEN Money ELSE 0 END) as Sum1,
SUM(CASE WHEN Mah = '11' AND Sal = '84' THEN Money ELSE 0 END) as Sum2
FROM vTable3
GROUP BY Code2, Name, Family

Arghavan_Reza
شنبه 26 بهمن 1387, 10:43 صبح
SELECT *, CASE Sum2 WHEN 0 THEN 0 ELSE Sum1 / Sum2 END AS Percent
FROM (SELECT Code2, Name, ....)