我在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)
的对象。鉴于2345Y
有Red
如何对上表进行分组,以便每个对象都具有一个括号中列出的所有属性
id property
1 1234X (Yel Gre), 2345Y (Red),
2 2222Y (Pin Red Gre ),
3 3454E (Yel Red), 4565Y (Whi),
答案 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 ;