Mam dwie zmienne, jedna nazywa się PaidThisMonth
, a druga nazywa OwedPast
. Oba są wynikiem niektórych podkwerend w SQL. Jak mogę wybrać mniejszą z dwóch i zwrócić ją jako wartość zatytułowaną PaidForPast
?
MIN
Funkcja działa na kolumnach, a nie zmienne.
tsql
sql-server
Malfist
źródło
źródło
Odpowiedzi:
Przypadek użycia:
Jako tabela Inline o wartości UDF
Stosowanie:
DODATEK: Jest to prawdopodobnie najlepsze w przypadku adresowania tylko dwóch możliwych wartości, jeśli są więcej niż dwie, rozważ odpowiedź Craiga przy użyciu klauzuli Values.
źródło
SQL Server 2012 i 2014 obsługuje funkcję IIF (cd, prawda, fałsz). Dlatego przy minimalnym wyborze możesz go używać jak
Podczas gdy IIF to tylko skrót do pisania
CASE...WHEN...ELSE
, łatwiej jest pisać.źródło
IIF
jest po prostu cukrem syntaktycznymCASE...WHEN...ELSE
.Rozwiązania wykorzystujące CASE, IIF i UDF są odpowiednie, ale niepraktyczne przy rozszerzaniu problemu na ogólny przypadek przy użyciu więcej niż 2 wartości porównawczych. Uogólnione rozwiązanie w SQL Server 2008+ wykorzystuje dziwne zastosowanie klauzuli VALUES:
Kredyt dzięki tej stronie: 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
źródło
MIN(x*(case x when 0 then null else 1 end))
Właśnie miałem sytuację, w której musiałem znaleźć maksymalnie 4 złożone selekcje w ramach aktualizacji. Dzięki takiemu podejściu możesz mieć tyle, ile chcesz!
Możesz także zastąpić liczby dodatkowymi zaznaczeniami
Bardziej złożone użycie
Jestem pewien, że UDF ma lepszą wydajność.
źródło
W przypadku MySQL lub PostgreSQL 9.3+ lepszym sposobem jest użycie funkcji
LEAST
iGREATEST
.Z:
GREATEST(value [, ...])
: Zwraca największy (o maksymalnej wartości) argument z podanych wartościLEAST(value [, ...])
Zwraca najmniejszy (o minimalnej wartości) argument z podanych wartościLinki do dokumentacji:
źródło
Oto sztuczka, jeśli chcesz obliczyć maksimum (pole, 0):
zwraca 0, jeśli
field
jest ujemne, w przeciwnym razie returnfield
.źródło
SELECT @a - ( ABS(@a-@b) + (@a-@b) ) / 2
Użyj instrukcji CASE.
Przykład B na tej stronie powinien być zbliżony do tego, co próbujesz zrobić:
http://msdn.microsoft.com/en-us/library/ms181765.aspx
Oto kod ze strony:
źródło
Użyj tabeli temp, aby wstawić zakres wartości, a następnie wybierz min / max tabeli temp z procedury składowanej lub UDF. Jest to podstawowa konstrukcja, więc w razie potrzeby możesz ją zmienić.
Na przykład:
źródło
Działa to maksymalnie dla 5 dat i obsługuje wartości zerowe. Po prostu nie mogłem go uruchomić jako funkcji Inline.
źródło
Opierając się na genialnej logice / kodzie Mathematix i Scott, przesyłam:
Chociaż przejście z funkcji MIN szkockiej do funkcji MAX powinno być dla mnie oczywiste, nie było, więc rozwiązałem ją i umieściłem tutaj: SELECT @a + (ABS (@ b- @ a) + ( @ b- @ a)) / 2. Losowo generowane liczby, choć nie są dowodami, powinny przynajmniej przekonać sceptyków, że obie formuły są poprawne.
źródło