Ich versuche, eine Abfrage in diese Richtung zu schreiben:
select *
from tbl
where
col1 = 1
and col2 = 2
and col3 = 3
order by
...
;
Ich möchte zuerst alle Ergebnisse, bei denen alle 3 WHERE
Bedingungen übereinstimmen (3/3), dann alle Ergebnisse, bei denen 2 Bedingungen übereinstimmen (2/3), und schließlich die Ergebnisse, bei denen 1 Bedingung übereinstimmt (1/3).
Jede dieser 3 Ergebnismengen muss nach geordnet werden (col4, col5, col6)
.
Kann ich das in einer einzigen Abfrage tun?
Zum Beispiel:
Beispiel http://img708.imageshack.us/img708/1646/sampletableresult1.jpg
Skript zum Erstellen von Testdaten:
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
Antworten:
oder für MS-Access:
quelle
IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
Würde dies erreichen, was Sie wollen? Technisch gesehen ist die Inline-Ansicht nicht erforderlich, da Sie die case-Anweisung in der Reihenfolge von wiederholen können.
quelle
quelle
(col1,col2,col3)
=(1,0,0)
(1 Übereinstimmung) vor der Zeile mit(0,2,3)
(2 Übereinstimmungen).