none
MAX / MIN aus zwei Spalten ausgeben RRS feed

  • 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 tblHMRZ

    Laut 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

    Mittwoch, 17. Mai 2017 10:05

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]

    Mittwoch, 17. Mai 2017 10:14
  • 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

    Mittwoch, 17. Mai 2017 10:16
    Moderator

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]

    Mittwoch, 17. Mai 2017 10:14
  • 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

    Mittwoch, 17. Mai 2017 10:16
    Moderator
  • 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

    Mittwoch, 17. Mai 2017 10:45
  • 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

    Donnerstag, 18. Mai 2017 08:00