it-swarm.asia

كيفية عمل ترتيب شرطي لعمودين أو أكثر

في MS SQL Server 2005 أقوم بكتابة استعلام واحد بفرز شرطي ومشكلتي هي أنني لا أعرف كيف يمكنني فرز شرطي باستخدام عمودين؟

إذا كتبت رمزًا مثل هذا فهو يعمل بشكل طبيعي

select
    *
from 
    table
order by 
    case @pkr 
           when 'kol' then kol
           when 'nci' then nci
    end

لا أعرف كيفية إجراء ترتيب شرطي لعمودين أو أكثر

select
    *
from 
    table
order by 
    case @pkr
        when 'KOL-NCI' then kol,nci
        when 'kol-MPCI' then kol,mpci
    end

هناك فكرة لجعل TSQL ديناميكي واستخدام sp_executesql لكن ما زلت أبحث عن فكرة أفضل؟

10
adopilot

سأعترف أنه لم يكن علي فعل ذلك من قبل ، لذلك كان هناك القليل من خدش الرأس. جدول أمثلة بسيط يوضح:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') AND type in (N'U'))
    DROP TABLE [dbo].[MyTable]
GO

CREATE TABLE dbo.MyTable
(
    col1 INT
    , col2 CHAR(1)
)
GO

INSERT dbo.MyTable (col1, col2) VALUES (1, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (1, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (1, 'C')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (2, 'C')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'A')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'B')
INSERT dbo.MyTable (col1, col2) VALUES (3, 'C')

باستخدام معلمةSortStyle للتمييز بين أوامر الفرز ، سيتم فرزSortStyle = 1 حسب col1 ASC, col2 DESC و @ SortStyle = 2 فرز حسب col2 DESC, col1 ASC.

DECLARE @SortStyle INT
SET @SortStyle = 1

SELECT
    col1
    , col2
FROM
    dbo.MyTable
ORDER BY
    CASE
        WHEN @SortStyle = 1 THEN col1
    END ASC,
    CASE
        WHEN @SortStyle = 1 THEN col2
    END DESC,
    CASE
        WHEN @SortStyle = 2 THEN col2
    END DESC,
    CASE
        WHEN @SortStyle = 2 THEN col1
    END ASC

SET @SortStyle = 2

SELECT
    col1
    , col2
FROM
    dbo.MyTable
ORDER BY
    CASE
        WHEN @SortStyle = 1 THEN col1
    END ASC,
    CASE
        WHEN @SortStyle = 1 THEN col2
    END DESC,
    CASE
        WHEN @SortStyle = 2 THEN col2
    END DESC,
    CASE
        WHEN @SortStyle = 2 THEN col1
    END ASC

كيف تطلب حسب معلمة يغطي الحالة الأبسط للفرز حسب عمود واحد فقط.

12
Mark Storey-Smith

بافتراض أن لديك المزيد من الحالات (أضفت واحدة) ، وجميع الأنواع متوافقة ،

order by 
    case @pkr
        when 'KOL-NCI' then kol
        when 'kol-MPCI' then kol
        when 'foo-bar' then foo
    end,
    case @pkr
        when 'KOL-NCI' then nci
        when 'kol-MPCI' then mpci
        when 'foo-bar' then bar 
    end

إنه ليس فرزًا متعدد الأعمدة: لديك فرز أساسي ، يليه فرز ثانوي. ما عليك سوى إلقاء نظرة على مربع حوار الفرز في Excel لمعرفة ما أعنيه.

5
gbn

مع المثال الذي تعطيه بسيط:

select *
from table
order by kol, case @pkr
                when 'KOL-NCI' then nci
                when 'kol-MPCI' then mpci
              end

هناك فكرة لجعل TSQL ديناميكي واستخدام sp_executesql لكني ما زلت أبحث عن فكرة أفضل.

من الجيد دائمًا تجنب SQL الديناميكي حيثما أمكن

1
Jack says try topanswers.xyz