Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以根据不同列中出现的值更改SQL表中的列顺序吗?_Sql_Netezza - Fatal编程技术网

我可以根据不同列中出现的值更改SQL表中的列顺序吗?

我可以根据不同列中出现的值更改SQL表中的列顺序吗?,sql,netezza,Sql,Netezza,我有一张这样的桌子: Column1 | Column2 | Column3| Column4 4 | 3 | 2 | 1 2 | 1 3 | 2 | 1 我希望翻转列,使1始终从列1开始,然后其余值跟随到右侧。像这样: Column1 | Column2 | Column3 | Column4 1 | 2 | 3 | 4 1 | 2

我有一张这样的桌子:

Column1 | Column2 | Column3| Column4
    4   |    3    |    2   |    1
    2   |    1
    3   |    2    |    1
我希望翻转列,使1始终从列1开始,然后其余值跟随到右侧。像这样:

Column1 | Column2 | Column3 | Column4
    1   |    2    |    3    |   4
    1   |    2    
    1   |    2    |    3
这是一个示例表。真正的表是一个公司的层次结构,例如,1=首席执行官,2=高级副总裁。1始终是相同的名称,但随着数字在命令链中越高,该级别中的名称就越多。我希望有一个自动的解决方案,可以查找1,将其作为第一列,然后填充列。我很挣扎,因为1代表的值在不同的列中,所以我不能只更改列的顺序

我可以使用VBA实现这一点,但我更愿意将其保存在SQL中


到目前为止,我还没有尝试过任何有用的代码。

您可以使用Case expression:

WITH CTE1 AS
(SELECT 4 AS COL1, 3  AS COL2 , 2 AS COL3, 1 AS COL4 FROM DUAL
UNION ALL
SELECT 2, 1, NULL, NULL FROM DUAL
UNION ALL
SELECT 3, 2, 1, NULL FROM DUAL
)
SELECT CASE WHEN COL1 <> 1 THEN 1 ELSE COL1 END AS COL1,
CASE WHEN COL2 <> 2 THEN 2 ELSE COL2 END AS COL2,
CASE WHEN COL3 <> 3 THEN 3 ELSE COL3 END AS COL3,
CASE WHEN COL4 <> 4 THEN 4 ELSE COL4 END AS COL4
FROM CTE1;

您可以应用一些案例检查所有可能性,这是假设缺失数据为空:

COALESCE(col4,col3,col2,col1) AS c1,

CASE
    WHEN col4 IS NOT NULL THEN col3
    WHEN col3 IS NOT NULL THEN col2
    WHEN col2 IS NOT NULL THEN col1
END AS c2,
    
CASE
    WHEN col4 IS NOT NULL THEN col2
    WHEN col3 IS NOT NULL THEN col1
END AS c3,
    
CASE
    WHEN col4 IS NOT NULL THEN col1
END AS c4

您希望对值进行排序。通用SQL解决方案将使用:

select max(case when seqnum = 1 then col end) as col1,
       max(case when seqnum = 2 then col end) as col2,
       max(case when seqnum = 3 then col end) as col3,
       max(case when seqnum = 4 then col end) as col4
from (select col1, col2, col3, col4, col,
             row_number() over (order by col) as seqnum
      from ((select col1 as col, 1 as which, col1, col2, col3, col4 from t) union all
            (select col2 as col, 2 as which, col1, col2, col3, col4 from t) union all
            (select col3 as col, 3 as which, col1, col2, col3, col4 from t) union all
            (select col4 as col, 4 as which, col1, col2, col3, col4 from t)
           ) t
      where col is not null
     ) t
group by col1, col2, col3, col4;

在支持横向联接的数据库中,这将更简单。每一行上都有一个唯一的id也会有帮助。

如果不考虑数据存储在哪里,为什么会有不同的列呢。。。我想如果你用代码填充一个结果表,你可以做任何你想做的事情,但是我想知道你是否在查询一个包含实际数据的数据库中的实际表?您是否从数据库表中的实际行中提取此数据?我这样问是因为Column1始终是Column1,并且表中该列中的行中的数据始终相同。当然,您可以使用CASE语句添加条件逻辑,以使数据的输出成为您想要/需要的任何内容?数据是经过计算的还是按原样存在的?你的数据库管理系统是什么?用你正在使用的数据库标记你的问题。谢谢。我应该在第一个问题上说得更清楚。这是一个示例表。真正的表是一个公司的层次结构,例如,1=首席执行官,2=高级副总裁。1始终是相同的名称,但随着数字在命令链中越高,该级别中的名称就越多。我不能显式地使用Case,因为我所描述的值2实际上是不同的值,但表示相同的级别。所以也许2.1和2.2会是一个更好的方式来描述这一点。我更新了我的问题。如果你能用虚拟值提供更真实的数据会更好