Saya memiliki dua variabel, satu disebut PaidThisMonth
, dan yang lainnya disebut OwedPast
. Keduanya merupakan hasil dari beberapa subquery di SQL. Bagaimana saya bisa memilih yang lebih kecil dari keduanya dan mengembalikannya sebagai nilai berjudul PaidForPast
?
The MIN
fungsi bekerja pada kolom, bukan variabel.
tsql
sql-server
Malfist
sumber
sumber
Jawaban:
Gunakan Kasus:
Sebagai tabel Inline dihargai UDF
Pemakaian:
TAMBAHKAN LAMPIRAN: Ini mungkin yang terbaik untuk ketika membahas hanya dua nilai yang mungkin, jika ada lebih dari dua, pertimbangkan jawaban Craig menggunakan klausa Nilai.
sumber
SQL Server 2012 dan 2014 mendukung fungsi IIF (lanjutan, benar, salah). Jadi untuk seleksi minimal Anda bisa menggunakannya seperti
Sementara IIF hanya singkatan untuk menulis
CASE...WHEN...ELSE
, lebih mudah untuk menulis.sumber
IIF
hanyalah gula sintaksis untukCASE...WHEN...ELSE
.Solusi menggunakan CASE, IIF, dan UDF memadai, tetapi tidak praktis ketika memperluas masalah ke kasus umum menggunakan lebih dari 2 nilai perbandingan. Solusi umum dalam SQL Server 2008+ menggunakan aplikasi aneh dari klausa VALUES:
Penghargaan karena situs web ini: http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/20/use-values-clause-to-get-the-maximum-value-from-some-columns-sql- server-t-sql.aspx
sumber
MIN(x*(case x when 0 then null else 1 end))
Saya baru saja mengalami situasi di mana saya harus menemukan maks 4 pilihan kompleks dalam pembaruan. Dengan pendekatan ini Anda dapat memiliki sebanyak yang Anda suka!
Anda juga dapat mengganti angka-angka dengan pemilihan tambahan
Penggunaan lebih kompleks
Saya yakin UDF memiliki kinerja yang lebih baik.
sumber
Untuk MySQL atau PostgreSQL 9.3+, cara yang lebih baik adalah dengan menggunakan
LEAST
danGREATEST
fungsinya.Dengan:
GREATEST(value [, ...])
: Mengembalikan argumen terbesar (bernilai maksimum) dari nilai yang diberikanLEAST(value [, ...])
Mengembalikan argumen terkecil (bernilai minimum) dari nilai yang diberikanTautan dokumentasi:
sumber
Ini adalah trik jika Anda ingin menghitung maksimum (bidang, 0):
mengembalikan 0 jika
field
negatif, jika tidak, kembalifield
.sumber
SELECT @a - ( ABS(@a-@b) + (@a-@b) ) / 2
Gunakan pernyataan KASUS.
Contoh B di halaman ini harus dekat dengan apa yang Anda coba lakukan:
http://msdn.microsoft.com/en-us/library/ms181765.aspx
Berikut kode dari halaman:
sumber
Gunakan tabel temp untuk memasukkan rentang nilai, lalu pilih min / maks tabel temp dari dalam prosedur tersimpan atau UDF. Ini adalah konstruksi dasar, jadi silakan revisi sesuai kebutuhan.
Sebagai contoh:
sumber
Ini berfungsi hingga 5 tanggal dan menangani nol. Hanya tidak bisa membuatnya berfungsi sebagai fungsi Inline.
sumber
Membangun logika / kode brilian dari Mathematix dan scottyc, saya serahkan:
Meskipun lompatan dari fungsi MIN scottyc ke fungsi MAX seharusnya sudah jelas bagi saya, ternyata tidak, jadi saya sudah menyelesaikannya dan memasukkannya di sini: SELECT @a + (ABS (@ b- @ a) + ( @ b- @ a)) / 2. Angka-angka yang dihasilkan secara acak, meskipun bukan bukti, setidaknya harus meyakinkan skeptis bahwa kedua formula itu benar.
sumber