So erstellen Sie eine bedingte Bestellung für zwei oder mehr Spalten


10

In MS SQL Server 2005 schreibe ich eine Abfrage mit bedingter Sortierung und mein Problem ist, dass ich nicht weiß, wie ich bedingte Sortierung mit zwei Spalten durchführen kann.

Wenn ich solchen Code geschrieben habe, funktioniert er normal

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

Ich weiß nicht, wie ich zwei oder mehr Spalten bedingt bestellen soll

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

Es gibt eine Idee, dynamisches TSQL zu erstellen und zu verwenden, sp_executesqlaber ich suche immer noch nach einer besseren Idee?



Sie können auch überprüfen, ob es sinnvoll ist, CASE .. END in einem ORDER BY zu haben. . Obwohl diese Frage im Kontext von PostgreSQL gestellt wurde, können die meisten Kommentare und Überlegungen zu WRT Dynamic Query vs CASEauf diesen Fall angewendet werden.
Joanolo

Antworten:


12

Ich gebe zu, dass ich das noch nie zuvor machen musste, also war ein bisschen Kopfkratzen dabei. Einfache Beispieltabelle zur Demonstration:

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

Bei Verwendung eines @ SortStyle-Parameters zur Unterscheidung zwischen Sortierreihenfolgen wird @SortStyle = 1 nach col1 ASC, col2 DESCund @ SortStyle = 2 nach sortieren 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

Wie Sie nach einem Parameter bestellen, behandelt den einfacheren Fall des Sortierens nach nur einer Spalte.


5

Angenommen, Sie haben mehr Fälle (ich habe einen hinzugefügt) und alle Typen sind 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

Es ist keine mehrspaltige Sortierung: Sie haben eine primäre Sortierung, gefolgt von einer sekundären Sortierung. Schauen Sie sich einfach das Sortierdialogfeld in Excel an, um zu sehen, was ich meine.


1

Mit dem Beispiel, das Sie geben, ist es einfach:

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

Es gibt eine Idee, dynamisches TSQL zu erstellen und zu verwenden, sp_executesqlaber ich suche immer noch nach einer besseren Idee.

Es ist immer schön, dynamisches SQL nach Möglichkeit zu vermeiden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.