2017-10-12 3 views
0

In unserer SQL-DB sind unsere vier Limits als separate Zeilen gespeichert.
Ich möchte die Limits als einzelne Zeile mit den vier Limits als Spalten zurück erhalten.
Die Daten wie folgt aussieht:SQL gibt mehrere Zeilen als einzelne Zeile zurück

TABLE A 
lsequence operator1 value1 operator2 value2 
1   <   10.5  {NULL}  {NULL} 
2   >=   11.5  <=   12.5 
3   >=   10.5  <=   13.5 
4   >   13.5  {NULL}  {NULL} 

TABLE B 
lsequence limittypeid 
    1   LowerFail 
    2   Pass  
    3   Warning  
    4   UpperFail 

Rückgabewert gesucht

LowerFail  Pass      Warning     UpperFail 
    < 10.5  >= 11.5 || <= 12.5  >= 10.5 || <= 13.5  > 13.5 

mit Fall-Funktion basiert auf 'limittypeid' ich bekommen die 4 colums ... Aber noch 4 Reihen. .
Aktuelle Return

COLUMN1  COLUMN2    COLUMN3     COLUMN4 
< 10.5 ||  
      >= 11.5 || <= 12.5   
            >= 10.5 || <= 13.5  
                  > 13.5 || 

Gebrauchte Code:

SELECT 
CASE 
WHEN a.limittypeid = 'LowerFail' 
THEN concat (b.operator1 , ' ' , b.value1 , ' || ' , b.operator2, ' ' , b.value2) 
END, 
CASE 
    WHEN a.limittypeid = 'Pass' 
    THEN concat (b.operator1 , ' ' , b.value1 , ' || ' , b.operator2, ' ' , b.value2) 
END, 
CASE 
    WHEN a.limittypeid = 'Warning' 
    THEN concat (b.operator1 , ' ' , b.value1 , ' || ' , b.operator2, ' ' , b.value2) 
END, 
    CASE 
    WHEN a.limittypeid = 'UpperFail' 
THEN concat (b.operator1 , ' ' , b.value1 , ' || ' , b.operator2 , ' ' , b.value2) 
END 
FROM 
    b 
    INNER JOIN b.lsequence = a.lsequence 
    WHERE ......conditions........ 

Ich weiß es möglich sein muss.

+0

Verschachtelte Abfragen verwenden – ammcom

Antwort

0

Sie vermissen nur die GROUP BY. Verwenden Sie die Spalte (n), die für die erwarteten Zeilen eindeutig sind.

Mehr über diesen Schwenk Technik: http://modern-sql.com/use-case/pivot

+0

Sind Sie sicher, dass eine fehlende GROUP BY das Problem ist? –

+0

@TimBiegeleisen Art. Folglich müssen Sie auch Aggregatfunktionen verwenden. Aber das ist der Weg zu gehen. Reduzieren Sie viele Zeilen auf weniger Zeilen mit einer gemeinsamen Eigenschaft -> GROUP BY. –

0

Verwenden Aggregation:

SELECT MAX(CASE WHEN a.limittypeid = 'LowerFail' 
       THEN concat(b.operator1 , ' ' , b.value1 , ' || ' , b.operator2, ' ' , b.value2) 
      END), 
     MAX(CASE WHEN a.limittypeid = 'Pass' 
      THEN concat(b.operator1 , ' ' , b.value1 , ' || ' , b.operator2, ' ' , b.value2) 
      END), 
     MAX(CASE WHEN a.limittypeid = 'Warning' 
       THEN concat(b.operator1 , ' ' , b.value1 , ' || ' , b.operator2, ' ' , b.value2) 
      END), 
     MAX(CASE WHEN a.limittypeid = 'UpperFail' 
       THEN concat(b.operator1 , ' ' , b.value1 , ' || ' , b.operator2 , ' ' , b.value2) 
      END) 
FROM b INNER JOIN 
    a 
    ON b.lsequence = a.lsequence 
WHERE ......conditions........; 

Die Verwendung von Aggregationen Funktionen (MAX()) in den SELECT macht daraus eine Aggregation Abfrage. Ohne GROUP BY gibt die Abfrage genau eine Zeile zurück.

Verwandte Themen