2017-10-12 70 views
0

在我们的SQL-DB中,我们的四个限制存储为单独的行。
我想将Limits作为单行,以四个Limits作为列。
数据样子:SQL将多行作为单行返回

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 

通缉返回值:

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

随着 'limittypeid' 我得到的4个colums Case函数基地......但还是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,查询只返回一行。