Vinzenz Mai: Kreuztabelle? Oder doch nicht

Beitrag lesen

Hallo

dann funktioniert das wunderbar. Bei

SELECT
  lambda,
  MAX(CASE WHEN messreihe = 1 THEN messung ELSE NULL END) AS messreferenz,
  (MAX(CASE WHEN messreihe = 2 THEN messung ELSE NULL END)-messreferenz) AS messreihe2,
  (MAX(CASE WHEN messreihe = 3 THEN messung ELSE NULL END)-messreferenz) AS messreihe3,
  (MAX(CASE WHEN messreihe = 5 THEN messung ELSE NULL END)-messreferenz) AS messreihe5
  FROM
    daten
  GROUP BY lambda


>   
> ergibt sich nun ein "1054 - Unknown column 'messreferenz' in 'field list'". Ich dachte man könne mit diesen Werten gleich weiterarbeiten?  
  
Nein, kannst Du mit [Spaltenaliasen nicht](http://dev.mysql.com/doc/refman/5.0/en/problems-with-alias.html).  
  
Daher wäre es  
  
~~~sql
  
SELECT  
    lambda,  
    MAX(CASE WHEN messreihe = 1 THEN messung ELSE NULL END) AS messreferenz,  
    MAX(CASE WHEN messreihe = 2 THEN messung ELSE NULL END)  
      - MAX(CASE WHEN messreihe = 1 THEN messung ELSE NULL END AS messreihe2,  
    MAX(CASE WHEN messreihe = 3 THEN messung ELSE NULL END)  
      - MAX(CASE WHEN messreihe = 1 THEN messung ELSE NULL END AS messreihe3,  
    MAX(CASE WHEN messreihe = 5 THEN messung ELSE NULL END)  
      - MAX(CASE WHEN messreihe = 1 THEN messung ELSE NULL END AS messreihe5  
    FROM  
        daten  
    GROUP BY lambda  

Zu Deiner Einschränkung für lambda < 2.2:

Gehe ich Recht in der Annahme, dass es performanter ist zu schreiben

SELECT
lambda,
MAX(CASE WHEN messreihe = 2 AND lambda < 2.2 THEN messung ELSE NULL END) AS messreihe2,
MAX(CASE WHEN messreihe = 3 AND lambda < 2.2 THEN messung ELSE NULL END) AS messreihe3,
MAX(CASE WHEN messreihe = 5 AND lambda < 2.2 THEN messung ELSE NULL END) AS messreihe5
FROM
   daten
GROUP BY lambda
HAVING lambda < 2.2

  
verwendest Du \*nicht\* die HAVING-Klausel sondern die WHERE-Klausel, vergleiche dazu einfach den verlinkten Abschnitt über Aliasnamen  
  
~~~sql
  
SELECT  
    lambda,  
    MAX(CASE WHEN messreihe = 1 THEN messung ELSE NULL END) AS messreferenz,  
    MAX(CASE WHEN messreihe = 2 THEN messung ELSE NULL END)  
      - MAX(CASE WHEN messreihe = 1 THEN messung ELSE NULL END AS messreihe2,  
    MAX(CASE WHEN messreihe = 3 THEN messung ELSE NULL END)  
      - MAX(CASE WHEN messreihe = 1 THEN messung ELSE NULL END AS messreihe3,  
    MAX(CASE WHEN messreihe = 5 THEN messung ELSE NULL END)  
      - MAX(CASE WHEN messreihe = 1 THEN messung ELSE NULL END AS messreihe5  
    FROM  
        daten  
    WHERE  
        -- Schränke die betrachteten Datensätze ein, bevor ausgewertet und  
        -- gruppiert wird.  
        lambda < 2.2  
    GROUP BY lambda  

HAVING schlägt erst dann zu, wenn schon alles ausgewertet wurde. EXPLAIN sollte da Unterschiede aufzeigen.

Freundliche Grüße

Vinzenz