2010-09-08 13 views
6

Estoy tratando de obtener la siguiente consulta para mostrar los resultados en orden alfabético por la ciudad excepto por el hecho de que yo quiero "Berlín" a aparecer en la parte superior de la listaSQL Server - Ordenar por caso

Así que la Los resultados se vería algo así como

  • Berlín
  • Argelia
  • Australia
  • Fiji
  • Grecia
  • ...

esperanza que tiene sentido,

que disponemos de la siguiente ...

SELECT CompanyName, City 
FROM customers 
ORDER BY case when City = 'Berlin' END 

Respuesta

1
SELECT CompanyName, City 
FROM customers 
ORDER BY case when City = 'Berlin' then 1 else 999 END asc 
+1

Por favor, perdone mi ignorancia, pero ¿qué significa este bit "then 1 else 999" ?? – Tom

+1

Los datos resultantes del caso. Cuando su Berlín devuelve 0 else, devuelve 999 –

+0

¿esta consulta necesita clientes también en orden por cláusula? Sin eso, no está dando resultados para las columnas numéricas –

15

Casi:

SELECT CompanyName, City 
FROM customers 
ORDER BY CASE WHEN City = 'Berlin' THEN 0 ELSE 1 END, City 
+0

Suena como esto debería funcionar, pero ¿por qué no lo hace en esta página SQL tryit? – Tom

+0

http://www.w3schools.com/sql/sql_tryit.asp – Tom

2

Prueba algo como

SELECT CompanyName, City 
FROM customers 
ORDER BY case when City = 'Berlin' THEN 0 ELSE 1 END, City 
7
SELECT CompanyName, City, CASE WHEN City = 'Berlin' THEN 0 ELSE 1 END AS Ordering 
FROM customers 
ORDER BY Ordering, City 
+1

+1 para conformidad con SQL-92, es decir, solo los nombres de columnas de la cláusula 'SELECT' deben usarse en la cláusula' ORDER BY'. He elegido hacer la vista gorda ante la palabra clave "AS" que falta, es decir, 'AS Ordering';) – onedaywhen

+0

Buena. Editó la respuesta –

1

cadena como blanco aparece por primera vez en cualquier lista de cadenas ordenada, todos los demás resultados ordenados normalmente. Por lo que este funciona perfectamente:

SELECT CompanyName, City 
FROM customers 
ORDER BY CASE WHEN City = 'Berlin' THEN '' ELSE City END 

probado con:

CREATE TABLE customers (CompanyName VARCHAR(50), City VARCHAR(50)) 

INSERT INTO customers VALUES ('Customer1', 'Berlin') 
INSERT INTO customers VALUES ('Customer2', 'Algeria') 
INSERT INTO customers VALUES ('Customer3', 'Australia') 
INSERT INTO customers VALUES ('Customer4', 'Fiji') 
INSERT INTO customers VALUES ('Customer5', 'Greece') 

SELECT CompanyName, City 
FROM customers 
ORDER BY CASE WHEN City = 'Berlin' THEN '' ELSE City END 

-- OUPUT 
-- Customer1 Berlin 
-- Customer2 Algeria 
-- Customer3 Australia 
-- Customer4 Fiji 
-- Customer5 Greece 
0

Cómo sobre el uso de la Unión? Algo como esto, por ejemplo:

SELECT 1 as Weight, CompanyName, City FROM customers 
WHERE city='Berlin' 
UNION ALL 
SELECT 2 as Weight, CompanyName, City FROM 
customers 
WHERE city<>'Berlin' 
ORDER BY Weight, City 
+2

Eso no funciona; ORDER BY se aplica a toda la unión, y usted aún se quedará con Argelia arriba. – LittleBobbyTables

+0

Gracias por el comentario. Pero ahora con paréntesis, funciona correctamente. Usé la página SQL tryit para verificar –

+0

Lo siento, no, está mal, mi error. La Unión ignora el orden en realidad ... –