İki veya daha fazla sütun için koşullu sipariş verme


10

MS SQL Server 2005'te koşullu sıralama ile bir sorgu yazıyorum ve benim sorunum nasıl iki sütun kullanarak koşullu sıralayabilirsiniz bilmiyorum olmasıdır?

Böyle bir kod yazsaydım normal çalışıyor

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

İki veya daha fazla sütun için koşullu sıralamayı nasıl yapacağımı bilmiyorum

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

Dinamik TSQL yapmak ve kullanmak sp_executesqliçin bir fikir var ama yine de daha iyi bir fikir mi arıyorsunuz?



Ayrıca bir SİPARİŞ TARAFINDAN CASE .. END olması mantıklı mı? . Her ne kadar bu soru PostgreSQL bağlamında sorulsa da, WRT dinamik sorgusu vs hakkındaki yorumların ve düşüncelerin çoğu CASEbu durum için uygulanabilir.
joanolo

Yanıtlar:


12

Bunu daha önce hiç yapmak zorunda olmadığımı itiraf edeceğim, bu yüzden biraz kafa kaşıma vardı. Gösterilecek basit örnek tablo:

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

Sıralama düzenleri arasında ayrım yapmak için bir @SortStyle parametresi kullanıldığında, @SortStyle = 1 sıralama col1 ASC, col2 DESCölçütü ve @ SortStyle = 2 sıralama ölçütü olacaktır 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

Bir parametreyi SİPARİŞ ETME, sadece 1 sütuna göre daha basit sıralama durumunu kapsar.


5

Daha fazla vakanız olduğu (bir tane ekledim) ve tüm türlerin uyumlu olduğunu varsayarsak,

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

Çok sütunlu bir sıralama değildir: önce birincil bir sıralama, ardından ikincil bir sıralama vardır. Ne demek istediğimi görmek için Excel'deki sıralama iletişim kutusuna bakın.


1

Verdiğiniz örnekle basit:

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

Dinamik TSQL yapmak ve kullanmak için bir fikir var sp_executesqlama yine de daha iyi bir fikir için sabırsızlanıyorum.

Mümkünse dinamik SQL'den kaçınmak her zaman iyidir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.