PDA

View Full Version : استفاده همزمان از دستور Distinct و order by



SAMARE
یک شنبه 17 آبان 1388, 09:27 صبح
سلام دوستان عزیز
من یه جدول دارم که تاریخ شمسی رو به صورت متنی در آن ذخیره میکنم و تاریخ میلادی رو به صورت date
و فیلد دیگری دارم که سال و ماه شمسی رو بصورت متنی در آن ذخره میکنم مثلا اگر تاریخ 1388/1/1 رو در دیتابیس ذخیره کنم در فیلد دیگر "فروردین 1388" ذخیره میشه
حالا میخوام در یک dropdownlist این فیلدهای ماه و سال(فروردین 1388) رو بصورت صعودی و بدون تکرار قرار بدم
ممنون میشم کمکم کنید

SAMARE
دوشنبه 18 آبان 1388, 12:12 عصر
کسی نیست جواب سوال من رو بده؟؟؟

SAMARE
دوشنبه 18 آبان 1388, 13:43 عصر
سوالم رو جور دیگه مطرح میکنم
من میخوام رکوردهای غیرتکراری از یک جدولی که بر اساس فیلد تاریخ میلادی بصورت نزولی مرتب شده رو انتخاب کنم
از چه نوع query باید استفاده کنم و چجوری؟؟؟

kashaneh
دوشنبه 18 آبان 1388, 18:59 عصر
دوست عزیز با این ترکیب فیلدهایی که شما دارید در صورتی که بخواهید در کوئری تمام فیلدها رو نشان دهید نمی توانید از DISTINCT استفاده کنید...
در ضمن استفاده همزمان DISTINCT و ORDER BY نیز نوعی تداخل کاری است... (البته به شرط نمایش همه فیلدها)
در صورتی که تنها بخواهید آن فیلد متنی ماه و سال شمسی را بدون تکرار و با یک مرتب سازی نشان دهید تنها راه شما این است که کوئری به شکل زیر باشد :



SELECT DISTINCT (Text_Shamsi)
FROM Table1
ORDER BY Text_Shamsi DESC;


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

SAMARE
دوشنبه 25 آبان 1388, 13:26 عصر
من یه بار دیگه مشکلم رو مطرح میکنم امیدوارم این بار نتیجه بده
من در برنامه ام یه تکست باکس دارم که کاربر تاریخ رو بصورت شمسی وارد میکنه
این تاریخ شمسی به میلادی تبدیل شده و هم شمسی و هم میلادی اون در دیتابیس ذخیره میشه
مثلا 25/8/1388 و 11-16-2009
حالا میخوام تاریخ های شمسی رو بصورت (8/ 1388) در یک dropdown بصورت نزولی قرار داده و براساس آنها سرچ انجام بدم!!!
یعنی اگر صدتا تاریخ داشتم که ماه و سالشون یکی بود فقط یه بار در dropdown درج بشه!!!

SAMARE
دوشنبه 25 آبان 1388, 14:09 عصر
دوست عزیز با این ترکیب فیلدهایی که شما دارید در صورتی که بخواهید در کوئری تمام فیلدها رو نشان دهید نمی توانید از DISTINCT استفاده کنید...
در ضمن استفاده همزمان DISTINCT و ORDER BY نیز نوعی تداخل کاری است... (البته به شرط نمایش همه فیلدها)
در صورتی که تنها بخواهید آن فیلد متنی ماه و سال شمسی را بدون تکرار و با یک مرتب سازی نشان دهید تنها راه شما این است که کوئری به شکل زیر باشد :



SELECT DISTINCT (Text_Shamsi)
FROM Table1
ORDER BY Text_Shamsi DESC;


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

AminSobati
دوشنبه 25 آبان 1388, 21:55 عصر
دوست عزیزم اگر فرمت متنی رو هم درست ذخیره کرده باشین، میتونین روی هر دو فیلد Distinct انجام بدین، فقط به خاطر داشته باشین در صورت استفاده از Distinct و Order By به طور همزمان، فقط روی فیلدهایی که در Select قید کردین میتونین Order By بزنین. در مورد صورت مسئله شما، روی فیلد تاریخ اصلی سورت کنین

Reza.ariyan
دوشنبه 25 آبان 1388, 21:58 عصر
SELECT DISTINCT
LEFT(Table_1.Shamsi, 7)
FROM Table_1
ORDER BY Table_1.Miladi

اگه به صورت میلادی هم ذخیره کرده باشید اینطوری میشه
در این روش باید تاریخ به صورت کامل وارد بشه
یعنی به جای وارد کردن 1388/8/5 باید وارد بشه 1388/08/05
یا 1388/5/11 باید وارد بشه 1388/05/11

Reza.ariyan
دوشنبه 25 آبان 1388, 22:25 عصر
همین رو بنویسی دیگه هیچی نمیخواد
حتی اگه تاریخ به صورت ناقص وارد بشه
کامل شده :



SELECT DISTINCT
LEFT(Table_1.Shamsi,
CHARINDEX('/', Table_1.Shamsi,
CHARINDEX('/', Table_1.Shamsi) + 1) - 1)
FROM Table_1
ORDER BY Table_1.Miladi

SAMARE
سه شنبه 26 آبان 1388, 13:56 عصر
دوست عزیز میشه کدتون رو توضیح بدید!؟

Reza.ariyan
سه شنبه 26 آبان 1388, 14:23 عصر
دوست عزیز میشه کدتون رو توضیح بدید!؟
بله میشه .

Reza.ariyan
سه شنبه 26 آبان 1388, 14:47 عصر
LEFT(Table_1.Shamsi,
CHARINDEX('/', Table_1.Shamsi,
CHARINDEX('/', Table_1.Shamsi) + 1) - 1)

تا اینجا این کد مکان دومین / رو پیدا میکنه برای مثال برای تاریخ 1369/8/5 مکان دومین / برابر 7 خواهد بود
بعد 7 را منهای یک میکنه که جواب میشه 6.
در مرحله نهایی از سمت چپ 6 کاراکتر اول رو سوا میکنه و خروجی میشه : 1369/8
--------
اگر تو سیستم شما تاریخ اینطوری هم ثبت بشه بازم کار میکنه : 1369/08/05
به این ترتیب که مکان دومین / رو پیدا میکنه که میشه 8
از 8 یکی کم میکنه که میشه 7
نهایتا 7 کاراکتر با ارزش سمت راست رو جدا میکنه که خروجی میشه 1369/08


---------------------------------------------------------------------------------------------------------
ORDER BY Table_1.Miladi

این خط هم که بر اساس تاریخ میلادی مرتب میکنه

تشکر لازم نیست