PDA

View Full Version : مرتب سازی دلخواه بر اساس order by



sadaf_
شنبه 09 دی 1391, 19:32 عصر
سلام
چطوری می تونم مرتب سازی دلخواه بسازم
مثلا

order by (field1,field2) , (field1,field3)

محمد سلیم آبادی
شنبه 09 دی 1391, 19:34 عصر
سلام، منظورت از اینکه فیلد 1 و 2 را داخل پرانتز گذاشتی اون یکی ها هم داخل یک پرانتز دیگه چیه؟
میتونی با یک نمونه داده مثال بزنی تا بفهمیم دقیقا چه مرتب سازی مدنظرت هست؟

sadaf_
شنبه 09 دی 1391, 19:47 عصر
با order by فقط یک فیلد را می شه مرتب سازی کرد
یعنی یک فیلد و سپس فیلد دیگر
3 تا فیلد دارم
کد حساب ، بدهکار ، بستانکار
حالا من میخوام کدحساب را بر اساس بدهکار و همچنین کدحساب بر اساس بستانکار مرتب کنم
در جدول من این داده های وجود داره
97507

حالا داده می بایست به این شکل مرتب بشه
97508

محمد سلیم آبادی
شنبه 09 دی 1391, 20:10 عصر
امتحان کن:
ORDER BY CASE WHEN credit = 0 THEN 0 ELSE 1 END,
CASE WHEN credit = 0 THEN debit ELSE credit END, code

sadaf_
شنبه 09 دی 1391, 20:21 عصر
امتحان کن:
ORDER BY CASE WHEN credit = 0 THEN 0 ELSE 1 END,
CASE WHEN credit = 0 THEN debit ELSE credit END, code
عالی بود
جواب داد
حالا چطوری صعودی یا نزولی بودنش را تعیین کنم؟
فقط می شه یک توضیح مختصری هم بدید

ممنونم

محمد سلیم آبادی
شنبه 09 دی 1391, 20:28 عصر
خوب توجه کن:
اگه میخواهی همون ساختار حفظ بشه فقط مثلا به جای اینکه debit ها صعودی باشن، نزولی مرتب بشن DESC رو بعد از END کیس دوم اضافه کن.
اگه میخواهی ساختارت برعکس بشه یعنی اول credit هارو نشون بده باید در کیس اولی credit رو با debit جابجا کنی. و در کیس دوم به جای credit=0 بنویسی debit=0 و جای debit و credit رو عوض کنی.

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

sadaf_
شنبه 09 دی 1391, 20:35 عصر
بسیار ممنونم
یک مشکل کوچیک چطوری الویت بر اساس کد باشه
ممنون

محمد سلیم آبادی
شنبه 09 دی 1391, 20:37 عصر
مسالت کلا عوض شد که!
در کد زیر به جای table_name اسم جدولتون رو بذارین و ستون rnk هم خواستین در خروجی select کنین:
SELECT *
FROM
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY Code ORDER BY CASE WHEN Credit = 0 THEN 0 ELSE 1 END,
CASE WHEN Credit = 0 THEN debit ELSE credit END) AS rnk
FROM table_name
)AS D
ORDER BY Code,rnk;

sadaf_
شنبه 09 دی 1391, 20:47 عصر
ORDER BY CASE WHEN credit = 0 THEN 0 ELSE 1 END,
CASE WHEN credit = 0 THEN debit ELSE credit END,code

sadaf_
شنبه 09 دی 1391, 20:51 عصر
فقط یک نکته ای که فراموش کردم بگم که
مرتب بودن بدهکار و بستانکار اصلا مهم نیست
فقط باید بر اساس کد مرتب وجود داشته باشه
ابتدا باید کدها مرتب و سپس بدهکار
و کدها مرتب و سپس بستانکار

محمد سلیم آبادی
شنبه 09 دی 1391, 20:51 عصر
عزیزم این کدی که پست کردین مطابق با اون نیازی که در پست اولیه مطرح کردین بود نه با این نیاز جدیدتون! من اون رو با مساله قبلی مطرح کردم الان شما یک مساله جدید مطرح کردین که کاملا متفاوت هست با اون چیزی که سابقا می گفتی. انتظار نباید داشته باشی که اون کد روی هر مساله ای که خواستی جواب بده.
از پست قبلیم استفاده کن ببین نیازتون رو براورده میکنه یا خیر.


فقط یک نکته ای که فراموش کردم بگم که
مرتب بودن بدهکار و بستانکار اصلا مهم نیست
فقط باید بر اساس کد مرتب وجود داشته باشه
وابتدا باید کدها مرتب و سپس بدهکار
و کدها مرتب و سپس بستانکار
خب در این حالت CASE دومی رو باید حذف کنی (در کد پست چهار)

بازم میگم این مساله جدیدت ارتباطی با مساله اولتون نداره. همون ROW_NUMBER رو برین.

sadaf_
شنبه 09 دی 1391, 20:55 عصر
مسالت کلا عوض شد که!
در کد زیر به جای table_name اسم جدولتون رو بذارین و ستون rnk هم خواستین در خروجی select کنین:
SELECT *
FROM
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY Code ORDER BY CASE WHEN Credit = 0 THEN 0 ELSE 1 END,
CASE WHEN Credit = 0 THEN debit ELSE credit END) AS rnk
FROM table_name
)AS D
ORDER BY Code,rnk;

دقیقا همین رو می خواستم
ممنون

sadaf_
شنبه 09 دی 1391, 20:58 عصر
عزیزم این کدی که پست کردین مطابق با اون نیازی که در پست اولیه مطرح کردین بود نه با این نیاز جدیدتون! من اون رو با مساله قبلی مطرح کردم الان شما یک مساله جدید مطرح کردین که کاملا متفاوت هست با اون چیزی که سابقا می گفتی. انتظار نباید داشته باشی که اون کد روی هر مساله ای که خواستی جواب بده.
از پست قبلیم استفاده کن ببین نیازتون رو براورده میکنه یا خیر.


خب در این حالت CASE دومی رو باید حذف کنی (در کد پست چهار)



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