Permintaan kecocokan terbaik dan pesanlah

9

Saya mencoba menulis kueri di bawah ini:

select * 
from tbl 
where 
       col1 = 1 
   and col2 = 2 
   and col3 = 3
order by
   ...
;

Saya ingin semua hasil pertama di mana semua 3 WHEREkondisi cocok (3/3), lalu semua hasil di mana 2 kondisi cocok (2/3), dan akhirnya hasil di mana semua 1 kondisi cocok (1/3).

Masing-masing dari 3 set hasil ini harus dipesan oleh (col4, col5, col6).

Bisakah saya melakukannya dalam satu permintaan?

Sebagai contoh:

sample http://img708.imageshack.us/img708/1646/sampletableresult1.jpg

Script untuk membuat data uji:

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
forX
sumber
jika memungkinkan tanpa 3! bergabung dengan sampel memiliki 3 col pertama, tetapi pada kenyataannya, lebih dari itu
forX
Jadi, Anda ingin menemukan semua baris di mana semua 3 kondisi cocok, lalu di mana 2 kondisi cocok, lalu di mana 1 kondisi apa pun cocok dan menyatukan semua hasil, diurutkan berdasarkan col4, 5, dan 6. Apakah itu benar?
Nick Chammas
ya, saya tahu, saya mencari cara lain, karena lebih dari 3 col
forX
1
baik, untuk saat ini yang akses (aku menunggu untuk mendapatkan server saya db sql)
forX
3
Jika pada akhirnya Anda akan menggunakan SQL Server, instal edisi ekspres . Bersihkan jalur peningkatan ke versi berbayar dan tidak ada berurusan dengan sintaks sintaksis di Access.
Mark Storey-Smith

Jawaban:

7
SELECT col1, 
       col2,
       col3, 
       col4, 
       col5, 
       col6
FROM TableX 
WHERE col1 = 1 
   OR col2 = 2 
   OR col3 = 3 
ORDER BY (CASE WHEN col1 = 1 THEN 1 ELSE 0 END) +
         (CASE WHEN col2 = 2 THEN 1 ELSE 0 END) +
         (CASE WHEN col3 = 3 THEN 1 ELSE 0 END) DESC,
         col4, col5, col6 

atau, untuk MS-Access:

ORDER BY IIF(col1 = 1,1,0) +
         IIF(col2 = 2,1,0) +
         IIF(col3 = 3,1,0) DESC,
         col4, col5, col6 
ypercubeᵀᴹ
sumber
@ Mark: Kombinasi apa yang Anda maksud? Bisakah Anda memberi contoh?
ypercubeᵀᴹ
@ypercube Saya mengakui, +1 :)
Mark Storey-Smith
@Mark: thnx, saya mulai khawatir bahwa saya tidak mengerti pertanyaannya.
ypercubeᵀᴹ
sepertinya bagus, tapi saya persediaan sekarang dengan akses db, dan saya coba ini, dan saya tidak mendapatkan hasil yang baik (PILIH col1, col2, col3, col4, col5, col6 DARI mytable WHERE col1 = 1 ATAU col2 = 2 ATAU col3 = 3 ORDER DENGAN IIF (col1 = 1,1,0) + IIF (col2 = 1,1,0) + IIF (col3 = 1,1,0) desc, col4, col5, col6)
forX
Modifikasi kecil:IIF(col1 = 1,1,0) +IIF(col2 = 2,1,0) +IIF(col3 = 3,1,0) desc
ypercubeᵀᴹ
1

Apakah ini akan mencapai apa yang Anda inginkan? Secara teknis tampilan inline tidak diperlukan karena Anda dapat mengulangi pernyataan kasus dalam urutan oleh.

select y.col1, 
       y.col2,
       y.col3, 
       y.col4, 
       y.col5, 
       y.col6
from (
      select col1, 
             col2, 
             col3, 
             case when col1 =1 and col2 = 2 and col3 = 3 then
                       1
                  when col1 = 1 and col2 = 2 and col3 <> 3 then
                       2
                  when col1 = 1 then
                       3
                  else 
                       4
             end x,
             col4, 
             col5, 
             col6
       from table
       )y
order by y.x, col4, col5, col6 
Kental
sumber
1
Bagaimana jika col1 dan col3 cocok? Atau hanya col2? OP sedang mencari semua 3 pertandingan, dua pertandingan, satu pertandingan.
Nick Chammas
1
SELECT col1,
       col2,
       col3,
       col4,
       col5,
       col6
FROM TableName
WHERE col1 = 1
   OR col2 = 2
   OR col3 = 3
ORDER BY (CASE WHEN col1 = 1 THEN 1 ELSE 0 END) DESC,
         (CASE WHEN col2 = 2 THEN 1 ELSE 0 END) DESC,
         (CASE WHEN col3 = 3 THEN 1 ELSE 0 END) DESC,
         col4, col5, col6
Praveen Prasannan
sumber
Tidak, kueri ini akan memesan baris dengan (col1,col2,col3)= (1,0,0)(1 kecocokan) sebelum baris dengan (0,2,3)(2 kecocokan).
ypercubeᵀᴹ