首页 > 解决方案 > 根据条件将表中的数据拆分为 2 列

问题描述

必须根据条件将表中的一列拆分为 2。全部在 select 子句中。

我的表有一列作为 detail_code。有 2 个详细代码。我希望每个详细代码在我的选择子句中作为单独的列。

我尝试了子查询,但它抛出子查询返回不止一行。

select id,(select detail_code from detc where type_ind ='C')as Detail_code1,
        (select detail_code from detc where type_ind ='P')as Detail_code2,
        (Select sum(amount) from amount_tbl where detail_code in (select detail_code from detc where type_ind ='C')and term_code='2019')as amt_detail_code1 
        from id_table;

我的输出应该是

Id  Detail_code1  Detail_code2  sum(amt_Detail_Code1)  sum(amt_Detail_code2)
1          C                P                  15                  45
2          C                P                 785                  74

我的意见

ID     Detail_cd   ind  amt
317002687   CA20    C   3
317002687   CA21    C   60
317002687   CA23    C   18.75
317002687   CA25    C   179.64
317002687   CA26    C   136.5
317002687   CA27    C   8.25
317002687   CA28    C   4
317002687   CA2B    C   8
317002687   CA2H    C   6.75
317002687   CA2I    C   237
317002687   CA2J    C   65.4

标签: sqloracle

解决方案


此查询将产生您描述的输出:

SELECT id, 'C' AS detail_code1, 'P' AS detail_code2,
       SUM(CASE WHEN ind = 'C' THEN amt END) AS sum_detail_code1,
       SUM(CASE WHEN ind = 'P' THEN amt END) AS sum_detail_code2
FROM name_of_your_input_table
GROUP BY id;

或者,由于您知道这两个详细代码是什么,您可以将它们设为列名,并将每列的值设为该详细代码的平均值。一种方法是旋转。下面是 Oracle 语法:

SELECT *
FROM (SELECT id, ind AS detail_code, amt
      FROM name_of_your_input_table)
PIVOT (AVG(amt)
       FOR detail_code IN ('C', 'P'));

推荐阅读