نمایش نتایج 1 تا 6 از 6

نام تاپیک: مشکل در مرتب سازی چند رکورد nvarchar

  1. #1
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    Ram
    پست
    322

    مشکل در مرتب سازی چند رکورد nvarchar

    سلام دوستان.همگی خسته نباشید.من قصد دارم جدولی را که شامل پنج فیلد هست رو مرتب کنم(Order By) اما به مشکل برخوردم از همه دوستان خواهش می کنم در صورت امکان کمک کنند.

    جدول شامل 5 فیلد به نام های a-b-c-d-e هست.
    همه فیلد ها باید nvarchar باشند.
    طول فیلد ها هم 6 کاراکتر هست.

    داخل تصویر ضمیمه ببینید فیلد قرمز رنگ باید بعد از فیلد آبی رنگ نمایش داده بشه اما در صورتی این اتفاق می افته که فیلد از نوع int باشه اما من به دلایلی مجبورم از nvarchar استفاده کنم.(دلیلش اینه که امکان داره کاربر به جای 1 مقداره 1/1 را وارد کنه یا مثلا 1/2).

    امیدوارم که دوستان بتونند راهنمایی کنند.تشکر
    عکس های ضمیمه عکس های ضمیمه

  2. #2

    نقل قول: مشکل در مرتب سازی چند رکورد nvarchar

    اینو امتحان کنید:
    ORDER BY LEN(a), a, LEN(b), b, LEN(c), c, LEN(d), d, LEN(e), e;
    وبلاگ من (Advanced SQL Querying)

  3. #3
    کاربر دائمی
    تاریخ عضویت
    فروردین 1388
    محل زندگی
    Ram
    پست
    322

    نقل قول: مشکل در مرتب سازی چند رکورد nvarchar

    سلام دوست من ممنونم از کمکت.تا حدودی درست شد اما باز مشکل اصلی حل نشده.
    یک رکورد با مقادیر زیر پر کنید و نتیجه را ببینید.
    a=1

    b=1

    c=1

    d=1/1

    e=1

    این رکورد باید چهارمین رکورد باشه طبق عکس بالا.ممنون

  4. #4

    نقل قول: مشکل در مرتب سازی چند رکورد nvarchar

    یعنی 1/1 باید بزرگتر از 1 در نظر گرفته بشه؟ همینطور 1/2 بزرگتر از 1/1؟
    وبلاگ من (Advanced SQL Querying)

  5. #5

    نقل قول: مشکل در مرتب سازی چند رکورد nvarchar

    این کوئری رو استفاده کنید و بررسی کنید که آیا دقیقا همون نتیجه مورد نظر و مطلوبتان را تولید می کند یا خیر:

    declare @t table
    (a varchar(10),
    b varchar(10),
    c varchar(10),
    d varchar(10),
    e varchar(10));

    insert @t
    values ('1','1','1','1','1'),
    ('1','1','1','1','2'),
    ('1','1','1','1','3'),
    ('1','1','1','1/1','1'),
    ('1','1','1','10','1'),
    ('1','1','1','9','1');

    SELECT a, b, c ,d ,e
    FROM (SELECT CASE WHEN CHARINDEX('/', a) = 0 THEN a + '/0' ELSE a END AS a1,
    CASE WHEN CHARINDEX('/', b) = 0 THEN b + '/0' ELSE b END AS b1,
    CASE WHEN CHARINDEX('/', c) = 0 THEN c + '/0' ELSE c END AS c1,
    CASE WHEN CHARINDEX('/', d) = 0 THEN d + '/0' ELSE d END AS d1,
    CASE WHEN CHARINDEX('/', e) = 0 THEN e + '/0' ELSE e END AS e1, *
    FROM @t) AS D
    ORDER BY LEN(a1), a1, LEN(b1), b1, LEN(c1), c1, LEN(d1), d1, LEN(e1), e1;

    /*
    a b c d e
    ---------- ---------- ---------- ---------- ----------
    1 1 1 1 1
    1 1 1 1 2
    1 1 1 1 3
    1 1 1 1/1 1
    1 1 1 9 1
    1 1 1 10 1
    */
    وبلاگ من (Advanced SQL Querying)

  6. #6

    نقل قول: مشکل در مرتب سازی چند رکورد nvarchar

    اگر بازم داده هایتون می تونه پیچیده تر از این حرفا باشه دو روش زیر هم می تونید امتحان کنید:

    declare @t table
    (a varchar(10),
    b varchar(10),
    c varchar(10),
    d varchar(10),
    e varchar(10));

    insert @t
    values ('1','1','1','1','1'),
    ('1','1','1','2/1000','2'),
    ('1','1','1','1','3'),
    ('1','1','1','1/1','1'),
    ('1','1','1','99/0','1'),
    ('1','1','1','9','1');

    --msalim 01
    SELECT a, b, c ,d ,e
    FROM (SELECT CASE WHEN CHARINDEX('/', a) = 0 THEN a + '/0' ELSE a END AS a1,
    CASE WHEN CHARINDEX('/', b) = 0 THEN b + '/0' ELSE b END AS b1,
    CASE WHEN CHARINDEX('/', c) = 0 THEN c + '/0' ELSE c END AS c1,
    CASE WHEN CHARINDEX('/', d) = 0 THEN d + '/0' ELSE d END AS d1,
    CASE WHEN CHARINDEX('/', e) = 0 THEN e + '/0' ELSE e END AS e1, *
    FROM @t) AS D
    ORDER BY LEN(LEFT(a1, CHARINDEX('/', a1))), LEFT(a1, CHARINDEX('/', a1)),
    LEN(RIGHT(a1, LEN(a1) - CHARINDEX('/', a1))), RIGHT(a1, LEN(a1) - CHARINDEX('/', a1)),
    LEN(LEFT(b1, CHARINDEX('/', b1))), LEFT(b1, CHARINDEX('/', b1)),
    LEN(RIGHT(b1, LEN(b1) - CHARINDEX('/', b1))), RIGHT(b1, LEN(b1) - CHARINDEX('/', b1)),
    LEN(LEFT(c1, CHARINDEX('/', c1))), LEFT(c1, CHARINDEX('/', c1)),
    LEN(RIGHT(c1, LEN(c1) - CHARINDEX('/', c1))), RIGHT(c1, LEN(c1) - CHARINDEX('/', c1)),
    LEN(LEFT(d1, CHARINDEX('/', d1))), LEFT(d1, CHARINDEX('/', d1)),
    LEN(RIGHT(d1, LEN(d1) - CHARINDEX('/', d1))), RIGHT(d1, LEN(d1) - CHARINDEX('/', d1)),
    LEN(LEFT(e1, CHARINDEX('/', e1))), LEFT(e1, CHARINDEX('/', e1)),
    LEN(RIGHT(e1, LEN(e1) - CHARINDEX('/', e1))), RIGHT(e1, LEN(e1) - CHARINDEX('/', e1));

    --msalim 02
    SELECT a, b, c ,d ,e
    FROM (SELECT CASE WHEN CHARINDEX('/', a) = 0 THEN a + '/0' ELSE a END AS a1,
    CASE WHEN CHARINDEX('/', b) = 0 THEN b + '/0' ELSE b END AS b1,
    CASE WHEN CHARINDEX('/', c) = 0 THEN c + '/0' ELSE c END AS c1,
    CASE WHEN CHARINDEX('/', d) = 0 THEN d + '/0' ELSE d END AS d1,
    CASE WHEN CHARINDEX('/', e) = 0 THEN e + '/0' ELSE e END AS e1, *
    FROM @t) AS D
    ORDER BY LEFT(a1, CHARINDEX('/', a1) - 1) * 1, RIGHT(a1, LEN(a1) - CHARINDEX('/', a1)) * 1,
    LEFT(b1, CHARINDEX('/', b1) - 1) * 1, RIGHT(b1, LEN(b1) - CHARINDEX('/', b1)) * 1,
    LEFT(c1, CHARINDEX('/', c1) - 1) * 1, RIGHT(c1, LEN(c1) - CHARINDEX('/', c1)) * 1,
    LEFT(d1, CHARINDEX('/', d1) - 1) * 1, RIGHT(d1, LEN(d1) - CHARINDEX('/', d1)) * 1,
    LEFT(e1, CHARINDEX('/', e1) - 1) * 1, RIGHT(e1, LEN(e1) - CHARINDEX('/', e1)) * 1;
    /*
    a b c d e
    ---------- ---------- ---------- ---------- ----------
    1 1 1 1 1
    1 1 1 1 3
    1 1 1 1/1 1
    1 1 1 2/1000 2
    1 1 1 9 1
    1 1 1 99/0 1
    */
    وبلاگ من (Advanced SQL Querying)

قوانین ایجاد تاپیک در تالار

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