PDA

View Full Version : ادغام دو رکورد به یک رکورد در کوئری



HamidNch
یک شنبه 05 شهریور 1391, 15:03 عصر
سلام به همه.
دوستان من یه مشکلی تو کوئری گرفتن برام پیش اومده .
بعد از گرفتن کوئری زیر نتیجه میشه این:

SELECT DISTINCT ResidNum,MyDate, Value
FRom table1 t1, table2 t2, table3 t3
where t1.MyDate = t2.MyDate, t1.ResidNum = t2.ResidNum
ORDER By ResidNum


شماره رسید تاریخ مقدار
116048 2012-08-26 00:00:00 100
116045 2012-08-26 00:00:00 9959
116044 2012-08-26 00:00:00 20770
116043 2012-08-26 00:00:00 182
116043 2012-08-26 00:00:00 9067

خروجی که بنده می خوام اینه که هرجا شماره رسید تکراری داشتیم دوتا رکورد ادغام بشه و به یه رکورد مبدل بشه.و چون در اینصورت دوتا فیلد مقدار خواهیم داشت می خوام یکی بشه مقدار1 و یکی دیگه بشه مقدار2

یعنی به اینصورت:

شماره رسید تاریخ مقدار1 مقدار2
116048 2012-08-26 00:00:00 100 0
116045 2012-08-26 00:00:00 9959 0
116044 2012-08-26 00:00:00 20770 0
116043 2012-08-26 00:00:00 182 9067



دوستان اگه راه حلی مدنظر دارن محبت کنن.خیلی کارم گیر این مسئله است.
باتشکر فراوان

baktash.n81@gmail.com
یک شنبه 05 شهریور 1391, 15:25 عصر
شما می تونید از Group By استفاده کنید به اینصورت جدول رو بر اساس شماره فاکتور GroupBy کنید و Sum مقدار ، Max تاریخ و Count شماره فاکتور رو در مقابل Select داشته باشید.


Select FaktoorNo,Count(FaktoorNo),Sum(Meghdar),Max(Date) from MyTable Group by FaktoorNo

HamidNch
یک شنبه 05 شهریور 1391, 15:36 عصر
ممنون از راهنماییتون.اما من نمی خوام مقدارها رو جمع کنم،بلکه می خوام یه ستون اضافه کنم و مقدار رو در اون بریزم اگه که رکورد تکراری نداشتیم مقدار دوم برابر مثلا صفر باشه.
شما تو مثال بنده به آخرین رکورد یعنی شماره رسید 116043 توجه بفرمائید.منطورم رو بهتر متوجه میشوید.

rahgozare_abi
یک شنبه 05 شهریور 1391, 22:46 عصر
ممنون از راهنماییتون.اما من نمی خوام مقدارها رو جمع کنم،بلکه می خوام یه ستون اضافه کنم و مقدار رو در اون بریزم اگه که رکورد تکراری نداشتیم مقدار دوم برابر مثلا صفر باشه.
شما تو مثال بنده به آخرین رکورد یعنی شماره رسید 116043 توجه بفرمائید.منطورم رو بهتر متوجه میشوید.

دوست عزیز باسلام
آیا مجوز استفاده از Cursor رو دارید؟ چون با دو Cursor و استفاده از دستور Exec قابلیت ایجاد خروجی مورد نظر را به راحتی دارید.

baktash.n81@gmail.com
دوشنبه 06 شهریور 1391, 07:17 صبح
اگه حداکثر دو رکورد به ازاء هر شماره رسید داشته باشتیم ....


Select FaktoorNo,Max(Meghdar),Min(meghdar),Max(Date)from MyTable Group by FaktoorNo

HamidNch
دوشنبه 06 شهریور 1391, 09:35 صبح
دوست عزیز جناب baktash.n81@gmail.com (http://barnamenevis.org/member.php?232678-baktash.n81-gmail.com) خیلی ممنون از راهنماییتون.این دستور جواب داد.فقط یه مورد دیگه هست.در مورد رکوردهایی که رسید تکراری دارن مشکلی وجود نداره.
اما می خوام اون رکوردهایی که رسیدشون تکراری نیبست برای مقدار 1 همون مقدار اصلی و برای مقدار2 عدد یک ثبت بشه.آیا این امکان وجود داره:یعنی بصورت زیر:

نتیجه نهایی:
شماره رسید تاریخ مقدار1 مقدار2
116048 2012-08-26 00:00:00 100 1
116045 2012-08-26 00:00:00 9959 1
116044 2012-08-26 00:00:00 20770 1
116043 2012-08-26 00:00:00 182 9067

و یه مورد دیگه اینکه اگه من بخوام یه فیلد دیگه بطور مثال توضیحات رو تو کوئری اضافه کنم طبعا باید اسم اون فیلد رو تو Group BY بنویسم.اما وقتی این کار رو میکنم دوباره تکرار رکوردها اتفاق می افته:



Select FaktoorNo,Max(Meghdar),Min(meghdar),Max(Date), Description from MyTable Groupby FaktoorNo,Description





نتیجه ای که میده اینه:

شماره رسید تاریخ مقدار1 مقدار2 توضیحات
116048 2012-08-26 00:00:00 100 100 متن
116045 2012-08-26 00:00:00 9959 9959 متن
116044 2012-08-26 00:00:00 20770 20770 متن
116043 2012-08-26 00:00:00 182 182 متن
116043 2012-08-26 00:00:00 9067 9067 متن
سپاس از همه دوستان.

baktash.n81@gmail.com
دوشنبه 06 شهریور 1391, 12:09 عصر
اگه حتما هر دو مقدار مربوط به یک رسید مساوی نیست ... می تونید از Case استفاده کنید ... که اگه مقدار Min و Max یکی بود Min که همون مقدار دومه 0 قرار داده بشه ...

اگه احتمال این وجود داره که دوتا مقدار مساوی باشه ... می تونید دوتا Select مختلف بنویسید و با هم union کنید ... توی اولی رکوردهایی غیر تکراری رو با Having مشخص کنی و Max و 0 رو Select کنی توی دومی رکورد های تکرار با Max و Min رو select کنی

اما فکر کنم یکم پیچیده شد ...

baktash.n81@gmail.com
دوشنبه 06 شهریور 1391, 12:33 عصر
Select FaktoorNo,Max(Meghdar),0,Max(Date)from MyTable Group by FaktoorNo having Count(*)=1
Union All
Select FaktoorNo,Max(Meghdar),Min(Meghdar),Max(Date)from MyTable Group by FaktoorNo having Count(*)=2

HamidNch
دوشنبه 06 شهریور 1391, 14:30 عصر
بازم مرسی از لطفتون.
با انجام کاری که فرمودین هنوز بعضیها رو اشتباه میاره ،رکوردهایی رو که با قرمز مشخص کردم هردو مقدار عین همه درصورتی که با هم فرق دارن ،این خروجی منه:

116051 21570 1 2012-08-27 00:00:00
116055 8588 175 2012-08-27 00:00:00
116056 22760 1 2012-08-27 00:00:00
116057 4497 4497 2012-08-27 00:00:00
116059 9067 182 2012-08-27 00:00:00
116060 9958 9958 2012-08-27 00:00:00
116061 994 994 2012-08-27 00:00:00
116065 4969 4969 2012-08-27 00:00:00
116066 9781 198 2012-08-27 00:00:00
116068 2510 50 2012-08-27 00:00:00
116069 9869 9869 2012-08-27 00:00:00
116071 2450 50 2012-08-27 00:00:00
116076 587 587 2012-08-27 00:00:00
116077 24000 1 2012-08-27 00:00:00
116080 22450 1 2012-08-27 00:00:00
116081 5003 5003 2012-08-27 00:00:00

از طرفی هم رکوردهایی که برگردونده در حال حاضر بطور مثال 17 رکورده که در واقع می بایست 33 رکورد باشه.

بازم ممنون.

baktash.n81@gmail.com
دوشنبه 06 شهریور 1391, 15:55 عصر
نمی دونم ... اگه Script جدول رو بزاری با اطلاعات ... یه نگاهی بهش بندازم ... اینجوری دیگه چیزی به ذهنم نمی رسه ...

HamidNch
سه شنبه 07 شهریور 1391, 08:35 صبح
سلام.
راستش داستان کاری که می خوام انجام بدم اینکه.تو شرکت ما از نرم افزار همکاران استفاده می کنیم.از طرفی هم من یه برنامه 6 سال پیش با دلفی نوشتم که بانکش اکسس هست.فاکتورهای فروشی که تو همکاران زده میشه ،دوباره به عنوان ورودی به برنامه من داده میشه واسه گرفتن یه سری گزارشات خاص تو شرکت.و من هر روز این فاکتورهای فروش رو هر روز دستی به برنامه ام وارد می کنم.
کاری که می خواستم انجام بدم اینه که از تو جداول غول آسا و تعداد بالای همکاران دنبال جداولی بگردم که حاوی فیلدهای موردنیازم باشهع.که البته این کار خیلی راحت نبود و بسختی تونستم سه چهار تا جدول و ویو پیدا کنم که حاوی فیلدهام باشه.
تااینجای کار مشکلی نیست و من موفق شدم.اما مشکل از اونجا شروع شد که من فیلدهای تعداد و مقدار دارم در صورتی که همکاران سیستم یه رکورد برای محصول حاوی مقدار ایجاد میکنه و یه رکورد برای ظرف محصول که تعداد رو مشخص میکنه و من می خواستم از تلفیق این دو رکورد به یه رکورد واحد برسم و درنهایت اونارو به دیتابیس اکسسم تزریق کنم.

گذاشتن جداول و اطلاعاتش واقعا کار سختیه و نمی دونم اصلا کدوم جدولها رو باید براتون بزارم.اط طرفی چیزی که داره کار اصلی رو انجام میده یه ویو هست که انکریپت شده هست و نمی خوام دیگه درگیر دیکریپ کردن اون بشم.
البته راهکاری که شمکا فرمودین کاملا کارسازه.مشکل در انتخاب جدولهایی هست که بنده دارم ازشون کوئری میگیرم.چون این اطلاعات در جداول زیادی میشینه که سخترین کار پیدا کردن جدولهایی هست که بشه ازشون خروجی درست گرفت.

در هرحال از این که وقت گذاشتین و زحمت پاسخگویی رو قبول کردین.یک دنیا ممنونم.اجرکم عندا...

majjjj
سه شنبه 07 شهریور 1391, 09:22 صبح
1به نظرم بد نیست از link server بجای افزودن دستی اطلاعات استفاده کنید
2 برای اینکه دیتاهاتون رو به درستی مشخص کنید میتونید از مهندسی معکوس در insert دیتا ها استفاده کنید

baktash.n81@gmail.com
سه شنبه 07 شهریور 1391, 09:42 صبح
خوب ... شاید بتونی دوبار عمل Insert رو انجام بدی ... یعنی یه بار مقدار 1 رو با سایر فیلدها Insert کنی ... بعد مقدار 2 رو Update کنی ...