2017-10-12 23 views
0

SQL-DBでは、4つの制限が別々の行として格納されています。
リミットを列として4つのリミットで1つの行に戻したいとします。
データは、次のようになります。複数の行を単一の行として返します

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 

は、戻り値募集: 'limittypeid' に関する事例関数塩基と

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

を私は4つのcolums ...しかし、まだ4行を取得。 。
現在の戻り値

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

使用されるコード:

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........ 

私はそれが可能である必要があります知っています。

+0

ネストされたクエリを使用する – ammcom

答えて

0

GROUP BYが欠落しています。予想される行に固有の列を使用します。このピボット技術約

詳細:http://modern-sql.com/use-case/pivot

+0

「GROUP BY」が見つからないことは問題ですか? –

+0

@TimBiegeleisen種類です。したがって、集約関数も使用する必要があります。しかし、これは行く方法です。多くの行を、共通プロパティ - > GROUP BYを共有するより少ない行に減らします。 –

0

使用集約:

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........; 

SELECTにおける集約関数(MAX())の使用は、集約クエリにこれを回します。 GROUP BYが指定されていない場合、クエリは正確に1つの行を返します。

関連する問題