Uporządkowanie rekordów w niestandardowy sposób

4-Lut-2012

Kiedy masz tabelę, powiedzmy produktów i chcesz je wyświettlić wg kolorów będzie to wyglądało mniej więcej tak. Oto definicja tabeli:

CREATE TABLE Products
(ProductId INT IDENTITY PRIMARY KEY,
ProductName NVARCHAR(30),
Color NVARCHAR(20))

 Tak mogłyby być wstawione rekordy:

INSERT INTO Products VALUES(‚Product 1’, ‚Red’), (‚Product 2′,’Green’), (‚Product 3′,’Yellow’), (‚Product 4′,’Blue’)

 A tak wyglądałoby wyświetlenie rekordów w kolejności „wg koloru”

SELECT ProductName, Color
FROM Products
ORDER BY Color

Rekordy zostaną jednak posortowane według koloru ale… w kolejności alfabetycznej. A gdyby tak chcieć, aby kolor Yellow był pierwszy, a Blue ostatni!? Przecież w Excelu to możliwe. Można zdefiniować listę niestandardową i gotowe.

W SQL też się da, choć nieco inaczej. Zacznijmy od zdefiniowania tabel, bo potrzebne będą dwie:

CREATE TABLE Colors
(ColorId INT IDENTITY PRIMARY KEY,
ColorName NVARCHAR(20),
ColorOrder INT)
 
CREATE TABLE Products
(ProductId INT IDENTITY PRIMARY KEY,
ProductName NVARCHAR(30),
ColorId INT REFERENCES Colors(ColorId))

 Tabela Produkty, nadal przechowuje nazwy produktów, ale kolor jest przechowywany nie bezpośrednio w postaci nazwy koloru, ale w postaci ColorID – liczby odwołującej się do identyfikatora koloru w tabeli Colors.

Tabela Colors przechowuje nazwę koloru, identyfikator koloru, do którego odnosi się tabela Produktów oraz, najważniejsze, ColorOrder – liczbę definiującą kolejność rekordu.

Wstawmy rekordy:

INSERT INTO Colors VALUES (‚Yellow’,100),(‚Green’,200),(‚Red’,300),(‚Blue’,400)
INSERT INTO Products VALUES(‚Product 1’, 3), (‚Product 2’,2), (‚Product 3’,1), (‚Product 4’,4)

Kolor Yellow ma teraz przypisany ID=1 oraz liczbę definiującą kolejność 100. Podobnie kolor Green ma ID=2, zaś liczbę definiującą kolejność równą 200.

Pora na zapytanie:

SELECT p.ProductName, c.ColorName
FROM Products p
JOIN Colors c ON p.ColorId = c.ColorId
ORDER BY c.ColorOrder

Wyświetlając rekord, jego nazwę pobierasz z tabeli Products, ale nazwę koloru oraz liczbę definiującą kolejność kolorów z tabeli Colors. Porządkując dane według ColorOrder, sam zdefiniowałeś niestandardowy sposób sortowania danych.

Porządek sortowania można łatwo zmienić zmieniając liczby porządkowe przy kolorach.

Dodaj komentarz:

Autor: Rafał Kraik