Cara membuat pemesanan bersyarat untuk dua kolom atau lebih

10

Dalam MS SQL Server 2005 saya menulis satu permintaan dengan pengurutan bersyarat dan masalah saya adalah bahwa saya tidak tahu bagaimana saya bisa mengurutkan bersyarat menggunakan dua kolom?

Jika saya menulis kode seperti ini berfungsi normal

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

Saya tidak tahu cara membuat pemesanan bersyarat untuk dua kolom atau lebih

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

Ada ide untuk membuat TSQL dinamis dan menggunakan sp_executesqltetapi saya masih mencari ide yang lebih baik?

adopilot
sumber
Anda juga dapat memeriksa Apakah masuk akal memiliki KASUS .. AKHIR di ORDER OLEH? . Meskipun pertanyaan itu diajukan dalam konteks PostgreSQL, sebagian besar komentar dan pertimbangan WRT vs kueri dinamisCASE dapat diterapkan pada kasus ini.
joanolo

Jawaban:

12

Saya akui saya belum pernah melakukan ini sebelumnya sehingga ada sedikit goresan kepala yang terlibat. Tabel contoh sederhana untuk diperagakan:

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')

Menggunakan parameter @SortStyle untuk membedakan antara perintah sortir, @SortStyle = 1 akan mengurutkan berdasarkan col1 ASC, col2 DESCdan @ SortStyle = 2 urutkan berdasarkan 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

Bagaimana Anda MEMESAN DENGAN parameter mencakup kasus penyortiran yang lebih sederhana dengan hanya 1 kolom.

Mark Storey-Smith
sumber
5

Dengan asumsi Anda memiliki lebih banyak kasus (saya menambahkan satu), dan semua jenis kompatibel,

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

Ini bukan jenis multi-kolom: Anda memiliki jenis primer, diikuti oleh jenis sekunder. Lihat saja kotak dialog sortir di Excel untuk melihat apa yang saya maksud.

gbn
sumber
1

Dengan contoh yang Anda berikan itu sederhana:

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

Ada ide untuk membuat TSQL dinamis dan digunakan sp_executesqltetapi saya masih mencari ide yang lebih baik.

Itu selalu baik untuk menghindari SQL dinamis jika memungkinkan

Jack mengatakan coba topanswers.xyz
sumber