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?
Select MinValue as PaidforPast From dbo.Minimum(@PaidThisMonth,@OwedPast)
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.
lepiej zrozumiała składnia: return (wybierz minValue = case when @@ param1 <@@ param2, a następnie @@ param1 else @@ param2 end). Ok, to może nie być znormalizowane, nie wiem. Ale jest to znacznie bardziej zrozumiałe i powinno zostać znormalizowane.
Innym powodem, dla którego wolę odpowiedź @ Craig poniżej, jest brak obsługi. Jeśli porównywane wartości są zerowalne, a jedna z porównywanych wartości ma wartość NULL, pokazany przypadek przełączenia może zwrócić wartość NULL lub wartość, w zależności od kolejności testu KIEDY (chyba że dodasz użycie ISNULL). Podejście Craiga zawsze będzie preferowało wybór wartości niepustej, która wydaje mi się bardziej poprawna, przynajmniej w moim obecnym przypadku użycia w porównaniu dat zerowych.
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:
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
select max(x)from(select1as'x'unionselect4as'x'unionselect3as'x'unionselect2as'x') a
Bardziej złożone użycie
@answer =select Max(x)from(select@NumberA as'x'unionselect@NumberB as'x'unionselect@NumberC as'x'unionselect(Select Max(score)from TopScores)as'x') a
Najbardziej podoba mi się ten, ponieważ jest to podstawowy SQL. Co więcej, UDF nie są koniecznie szybsze. W przypadku większości sklepów z kolumnami każdy atrybut (zakładam, że również będziesz filtrować według atrybutów) może być obliczany równolegle, a tylko zestaw kwalifikujący jest łączony. Związki nie są więc same w sobie wolne.
@RobertoRodriguez byłoby najlepiej, gdyby pytanie zawierało znaczniki MySQL lub PostgreSQL jako część pytania. Pytanie dotyczyło konkretnie tsql, więc ta odpowiedź w ogóle nie pomaga.
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:
CREATEPROCEDURE GetMinSpeed()ASBEGINCREATETABLE#speed (Driver NVARCHAR(10), SPEED INT);'
'Insertany number of data you need to sort and pull from'
INSERT INTO #speed (N'Petty', 165)
INSERT INTO #speed (N'Earnhardt', 172)
INSERT INTO #speed (N'Patrick',174)SELECT MIN(SPEED)FROM#speed
DROPTABLE#speed
END
Opierając się na genialnej logice / kodzie Mathematix i Scott, przesyłam:
DECLARE@a INT,@b INT,@c INT =0WHILE@c <100BEGINSET@c +=1SET@a = ROUND(RAND()*100,0)-50SET@b = ROUND(RAND()*100,0)-50SELECT@a AS a,@b AS b,@a -( ABS(@a-@b)+(@a-@b))/2AS MINab,@a +( ABS(@b-@a)+(@b-@a))/2AS MAXab,CASEWHEN(@a <=@b AND@a =@a -( ABS(@a-@b)+(@a-@b))/2)OR(@a >=@b AND@a =@a +( ABS(@b-@a)+(@b-@a))/2)THEN'Success'ELSE'Failure'ENDAS Status
END
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.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.