如何在Netezza中将列填充为行

如何在Netezza中将列填充为行

问题描述:

我是Netezza的新手,我需要您的帮助将15列转换为目标表中的行。如何在Netezza中将列填充为行

我遇到过REGEXP函数,但我不确定确切的语法。

这里是例子:

来源有它作为

Col 1 Col 2 Col 3 Col 4 Col 5 Col 6 
1  2  3  4  5 6 

预期目标

Col A 

1 
2 
3 
4 
5 
6 

我在这里引用的6列,但我有3套15列,这样我没有感觉结合是一个正确的选择。请帮我

+0

欢迎来到Stack Overflow!请[编辑]你的问题,以显示[你迄今为止所尝试的](http://whathaveyoutried.com)。您应该包含您遇到问题的代码[mcve],然后我们可以尝试帮助解决特定问题。你还应该阅读[问]。 –

一个简单的方法是union all

select col1 as colA from t union all 
select col2 from t union all 
select col3 from t union all 
select col4 from t union all 
select col5 from t union all 
select col6 from t; 

我看不出有什么正则表达式的功能与你的问题,这基本上是如何在Netezza公司做“逆透视”做。

+0

感谢您的回复戈登,那么除了工会之外没有别的选择吗? – Anusha

+0

@Anusha。 。 。实际上,还有其他选择,但“全部结合”似乎足够了。 –

如果你不想做的14 UNION ALL你可以利用CROSS JOIN到一个表/查询与1和15(或类似的东西)之间的数字返回15行:

select 
    case i 
     when 1 then col1 
     when 2 then col2 
     when 3 then col3 
     ... 
    end 
from tab 
cross join 
(
    select i from numbers_table where i between 1 and 15 
) dt 
+0

嗨Dnoeth,你能解释'我'在这里,并与dt表交叉? – Anusha

+0

正如我所说的,这只是一个Select,它返回具有唯一值的15行,由于交叉连接,您将源表中的每一行都获得15次,而'CASE'用于将每个col1与col15匹配为单个行 – dnoeth

交叉加入方法 加入dnoeth说的话,你首先要确保你有一个numbers_table。这将是您将交叉加入的表格。在这种情况下,我不是函数的一部分。它只是一个列名。它可以很容易地被命名为ColX。在你的例子中,你有6列,所以我插入6行,1-6。尽管保留这张表格的大版本可能会很方便。

CREATE TABLE NUMBERS_TABLE 
(i INT); 
INSERT INTO NUMBERS_TABLE VALUES (1); 
INSERT INTO NUMBERS_TABLE VALUES (2); 
INSERT INTO NUMBERS_TABLE VALUES (3); 
INSERT INTO NUMBERS_TABLE VALUES (4); 
INSERT INTO NUMBERS_TABLE VALUES (5); 
INSERT INTO NUMBERS_TABLE VALUES (6); 

注意:交叉连接会创建笛卡尔积,所以要小心。

WITH CTE AS (SELECT COL1, COL2, COL3, COL4, COL5, COL6 FROM ORIGINAL_TABLE) 

SELECT 
,CASE B.i 
    WHEN 1 THEN 'COL1' 
    WHEN 2 THEN 'COL2' 
    WHEN 3 THEN 'COL3' 
    WHEN 4 THEN 'COL4' 
    WHEN 5 THEN 'COL5' 
    WHEN 6 THEN 'COL6' 
    END AS UNPIVOTED_COLUMN_NAMES 
,CASE B.i 
    WHEN 1 THEN A.COL1 
    WHEN 2 THEN A.COL2 
    WHEN 3 THEN A.COL3 
    WHEN 4 THEN A.COL4 
    WHEN 5 THEN A.COL5 
    WHEN 6 THEN A.COL6 
    END AS COLUMN_A 
FROM CTE A CROSS JOIN 
(SELECT i FROM NUMBERS_TABLE WHERE i in ('1','2','3','4','5','6')) B