J'essaie d'écrire une requête dans ce sens:
select *
from tbl
where
col1 = 1
and col2 = 2
and col3 = 3
order by
...
;
Je veux d'abord tous les résultats où les 3 WHERE
conditions correspondent (3/3), puis tous les résultats où 2 conditions correspondent (2/3), et enfin les résultats où 1 condition correspond (1/3).
Chacun de ces 3 jeux de résultats doit être commandé par (col4, col5, col6)
.
Puis-je le faire en une seule requête?
Par exemple:
exemple http://img708.imageshack.us/img708/1646/sampletableresult1.jpg
Script pour créer des données de test:
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
Réponses:
ou, pour MS-Access:
la source
IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
Cela permettrait-il d'atteindre ce que vous voulez? Techniquement, la vue en ligne n'est pas nécessaire car vous pouvez répéter la déclaration de cas dans l'ordre par.
la source
la source
(col1,col2,col3)
=(1,0,0)
(1 correspondance) avant la ligne avec(0,2,3)
(2 correspondances).