Estoy tratando de escribir una consulta a lo largo de estas líneas:
select *
from tbl
where
col1 = 1
and col2 = 2
and col3 = 3
order by
...
;
Quiero primero todos los resultados donde WHERE
coincidan las 3 condiciones (3/3), luego todos los resultados donde coincidan 2 condiciones (2/3), y finalmente los resultados donde coincida cualquier condición 1 (1/3).
Cada uno de estos 3 conjuntos de resultados debe ordenarse por (col4, col5, col6)
.
¿Puedo hacer eso en una sola consulta?
Por ejemplo:
ejemplo http://img708.imageshack.us/img708/1646/sampletableresult1.jpg
Script para crear datos de prueba:
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 INT
, col3 INT
, col4 INT
, col5 INT
, col6 INT
)
GO
INSERT dbo.MyTable (col1, col2, col3, col4, col5, col6)
SELECT 1,2,3,2,1,1 UNION ALL
SELECT 1,2,30,1,1,1 UNION ALL SELECT 1,20,30,1,1,1 UNION ALL
SELECT 10,20,3,1,1,1 UNION ALL SELECT 10,2,30,1,1,1 UNION ALL
SELECT 10,2,3,1,1,1 UNION ALL SELECT 10,20,30,1,1,1 UNION ALL
SELECT 1,2,3,1,1,1 UNION ALL SELECT 1,2,3,1,2,2 UNION ALL
SELECT 1,2,3,1,2,3 UNION ALL SELECT 1,20,3,1,1,1
GO
Respuestas:
o, para MS-Access:
fuente
IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
¿Esto lograría lo que quieres? Técnicamente, la vista en línea no es necesaria, ya que podría repetir la declaración del caso en el orden por.
fuente
fuente
(col1,col2,col3)
=(1,0,0)
(1 coincidencia) antes de la fila con(0,2,3)
(2 coincidencias).