如何在Teradata中对子字符串进行分组?

时间:2014-04-11 13:57:25

标签: teradata

我在Teradata 14中有下表,但是我不允许自己编写程序和函数

id  property
1   1234X (Yel), 2345Y (Red), 1234X (Gre),
2   2222Y (Pin), 2222Y (Red), 2222Y (Gre),
3   3454E (Yel), 4565Y (Whi), 3454E (Red),

所有行都以相同的方式。例如。第1行:1234X是一个具有属性(Yel)(Gre)的对象。鉴于2345YRed


如何对上表进行分组,以便每个对象都具有一个括号中列出的所有属性

id  property
1   1234X (Yel Gre), 2345Y (Red), 
2   2222Y (Pin Red Gre ),
3   3454E (Yel Red), 4565Y (Whi), 

1 个答案:

答案 0 :(得分:2)

WITH chunk(id,property,a,b,c,combined) AS
(SEL id,
 property,
 STRTOK(property, ',', 1) AS a,
 STRTOK(property, ',', 2) AS b,
 STRTOK(property, ',', 3) AS c,
CASE WHEN SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(b),1,5) AND SUBSTRING(TRIM(a),1,5) <>SUBSTRING(TRIM(c),1,5)
            THEN SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(b),8,3)||')'||','||c||','
      WHEN  SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(c),1,5) AND SUBSTRING(TRIM(a),1,5)<>SUBSTRING(TRIM(b),1,5)
            THEN SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(c),8,3)||')'  ||','||TRIM(b)||','  
      WHEN  SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(b),1,5) AND    SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(c),1,5)  
        THEN    SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(b),8,3)||'  '||SUBSTRING(TRIM(c),8,4)||','                               
      ELSE 'Condition failed'
 END AS combined                            
 FROM Table2)
SELECT id,combined FROM chunk 
ORDER BY id  ;

OUTPUT#

    id  combined
    1   1234X (Yel Gre),2345Y (Red),
    2   2222Y (Pin Red Gre),
    3   3454E (Yel Red),4565Y (Whi),

动态方式: Is it possible to group string within a string in Teradata?

改性#

SEL id
  , property
  , SUBSTRING (property FROM 1 FOR INSTR(property, ',', 1, 1)-1 ) AS a
  , SUBSTRING (property FROM INSTR(property, ',', 1, 1)+1 FOR INSTR(property, ',', 1, 2) -INSTR(property, ',', 1, 1)-1 ) AS b
  , SUBSTRING (property FROM INSTR(property, ',', 1, 2)+1 FOR INSTR(property, ',', 1, 3) -INSTR(property, ',', 1, 2)-1 ) AS c 
  ,CASE 
      WHEN SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(b),1,5) AND SUBSTRING(TRIM(a),1,5)<>SUBSTRING(TRIM(c),1,5) 
         THEN SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(b),8,3)||')'||','||c||',' 
      WHEN SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(c),1,5) AND SUBSTRING(TRIM(a),1,5)<>SUBSTRING(TRIM(b),1,5) 
         THEN SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(c),8,3)||')' ||','||TRIM(b)||','
      WHEN SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(b),1,5) AND SUBSTRING(TRIM(a),1,5)=SUBSTRING(TRIM(c),1,5)
         THEN SUBSTRING(TRIM(a),1,10) || ' ' || SUBSTRING(TRIM(b),8,3)||' '||SUBSTRING(TRIM(c),8,4)||','
      ELSE 'Condition failed' 
   END AS combined
FROM table2 ;