SQL将多行作为单行返回

时间:2017-10-12 11:17:54

标签: sql

在我们的SQL-DB中,我们的四个限制存储为单独的行 我希望将限制恢复为单行,将四个限制作为列 数据如下所示:

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 

基于案例功能基于&#39; limittypeid&#39;我得到4列...但仍然是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........

我知道一定是可能的。

2 个答案:

答案 0 :(得分:0)

你只是错过了GROUP BY。使用那些对于预期行唯一的列。

有关此透视技术的更多信息:https://cdn.company.com

答案 1 :(得分: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........;

MAX()中使用聚合函数(SELECT)将其转换为聚合查询。没有GROUP BY,查询只返回一行。