Benutzer mit den meisten Antworten
MAX / MIN aus zwei Spalten ausgeben

Frage
-
Hallo zusammen,
in einer Abfrage ermittel ich CPK-Werte 8Prozessfähigkeitsindex) aus einer Messreihe, und zwar den oberen un den Unteren:
SELECT (AVG(RZ)- @USG) / 3 * STDEV(RZ) AS 'CPKu',
(@OSG - AVG(RZ)) / 3 * STDEV(RZ) AS 'CPKo' FROM tblHMRZLaut der Definition für CPK muss ich aber nur den kleineren der beiden Werte ausgeben. Ich bräuchte also sowas ähnliches wie
SELECT MIN(CPKu, CPKo) AS 'CPK-Wert'
Gibt solche "Aggregatfunktionen", die zwei Spalten miteinander vergleichen?
Vielen Dank im Voraus!
Manu
Antworten
-
Hallo Manu,
Im Standard gibt es keine solche Funktion, man kann sich aber eine solche leicht in T-SQL schreiben.
Du kannst Du die Abfrage aber auch etwas umstellen, um die Standard MIN Aggregation zu nutzen
SELECT MIN(CPKu) AS MinCPKu FROM (SELECT (AVG(RZ)- @USG) / 3 * STDEV(RZ) AS CPKu FROM tblHMRZ UNION ALL SELECT (@OSG - AVG(RZ)) / 3 * STDEV(RZ) FROM tblHMRZ ) AS SUB
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort vorgeschlagen Stefan FalzModerator Mittwoch, 17. Mai 2017 11:34
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 31. Mai 2017 08:44
-
Hallo Manu,
ich hab nicht so wirklich verstanden, was Du meinst. Falls es dir darum geht, ausgehend von deiner ersten Abfrage für jede Zeile CPKu und CPKo zu vergleichen und jeweils nur den kleinsten Wert zurückzugeben, kann man das bspw. so machen:
WITH Query AS ( SELECT (AVG(RZ)- @USG) / 3 * STDEV(RZ) AS [CPKu], (@OSG - AVG(RZ)) / 3 * STDEV(RZ) AS [CPKo] FROM tblHMRZ ) SELECT CASE WHEN CPKu <= CPKo THEN CPKu ELSE CPLo END AS [CPK-Wert] FROM Query
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Stefan FalzModerator Mittwoch, 17. Mai 2017 11:34
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 31. Mai 2017 08:44
Alle Antworten
-
Hallo Manu,
Im Standard gibt es keine solche Funktion, man kann sich aber eine solche leicht in T-SQL schreiben.
Du kannst Du die Abfrage aber auch etwas umstellen, um die Standard MIN Aggregation zu nutzen
SELECT MIN(CPKu) AS MinCPKu FROM (SELECT (AVG(RZ)- @USG) / 3 * STDEV(RZ) AS CPKu FROM tblHMRZ UNION ALL SELECT (@OSG - AVG(RZ)) / 3 * STDEV(RZ) FROM tblHMRZ ) AS SUB
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort vorgeschlagen Stefan FalzModerator Mittwoch, 17. Mai 2017 11:34
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 31. Mai 2017 08:44
-
Hallo Manu,
ich hab nicht so wirklich verstanden, was Du meinst. Falls es dir darum geht, ausgehend von deiner ersten Abfrage für jede Zeile CPKu und CPKo zu vergleichen und jeweils nur den kleinsten Wert zurückzugeben, kann man das bspw. so machen:
WITH Query AS ( SELECT (AVG(RZ)- @USG) / 3 * STDEV(RZ) AS [CPKu], (@OSG - AVG(RZ)) / 3 * STDEV(RZ) AS [CPKo] FROM tblHMRZ ) SELECT CASE WHEN CPKu <= CPKo THEN CPKu ELSE CPLo END AS [CPK-Wert] FROM Query
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Stefan FalzModerator Mittwoch, 17. Mai 2017 11:34
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 31. Mai 2017 08:44
-
Hallo zusammen,
vielen Dank für eure schnellen Antworten. Beides funktioniert wunderbar.
Letzteres von Stefan würde auch noch funktionieren, wenn die beiden Spalten CPKu und CPKo jeweils mehrere Werte hätten, was in meinem Fall nicht vorkommt.Super! :)
Manu -
Mit 2 Werten ist das noch übersichtlich, mit mehr als 2 Werten wird es schon schwieriger.
Hier gibt es aber (in meinen Augen) die perfekte Lösung: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
Vorteil:
- beliebige Anzahl Spalten
- ignorieren von NULL-Werten (der CASE-Ausdruck gibt NULL, wenn nur einer der beiden Werte NULL ist
- Verwendung von MAX(DISTINCT ...) möglich