在Oracle SQL中将连接字符串转换为列名

时间:2016-11-20 09:54:24

标签: sql oracle oracle10g to-date

问题陈述:

我有一个名为ACTIVITIES的表,所有列的数据类型为varchar(20),如下所示:

|ACTIVITY_NAME|  Q1  |  Q2  |  Q3  |  Q4  |
|ACT1         |02/05 |05/10 |08/21 |11/15 |
|ACT2         |01/20 |06/11 |08/06 |10/21 |

使用此表,我希望根据系统日期获取当前季度,以选择特定行并将季度数据转换为日期。截至目前,我有这个查询,但是一个错误提示说我发现了一个非数字字符,其中数字是我真正熟悉的数字。

select to_date(concat('Q', to_char(sysdate, 'Q')), 'MM/DD')
  from activities
 where activity_name = 'ACT2';

concat()函数的结果是一个字符串,如下所示,这就是错误提示的原因。

select to_date('Q4', 'MM/DD')
  from activities
 where activity_name = 'ACT2';

现在,我正在寻求有关如何将连接字符串转换为列名的帮助,以便我在当前季度和特定活动中提取特定数据。

预期结果:

查询:

select to_date(Q4, 'MM/DD')
  from activities
 where activity_name = 'ACT2';

- to_date()函数内的Q4参数现在被视为列名,而不是String。正如上面的问题陈述中所提到的,我如何将该Q4字符串参数转换为列名,以便我可以得到下面的输出。

输出:08/06/2016

我是oracle sql的新手,我想向你们学习。非常感谢您的帮助。提前谢谢你。

1 个答案:

答案 0 :(得分:0)

最简单的方法是先删除数据:

SELECT *
FROM ACTIVITIES
UNPIVOT (
  Quarter_date FOR qq IN (Q1, Q2, Q3, Q4 )
)
;

你会得到这样的结果:

ACTI QQ QUARTER_DA
---- -- ----------
ACT1 Q1 02/05     
ACT1 Q2 05/10     
ACT1 Q3 08/21     
ACT1 Q4 11/15     
ACT2 Q1 01/20     
ACT2 Q2 06/11     
ACT2 Q3 08/06     
ACT2 Q4 10/21     

现在选择任意一个季度非常容易,例如,如果您需要Q4,只需添加WHERE QQ='Q4'条件:

SELECT *
FROM (
   -- the above query goes here ----
    SELECT * FROM ACTIVITIES
    UNPIVOT (
        Quarter_date FOR qq IN (Q1, Q2, Q3, Q4 )
    )
)
-- replace the below line with:
--    WHERE QQ =  'Q' || to_char(sysdate, 'Q')
-- if you want to get the current quarter based on sysdate
WHERE QQ = 'Q4'
;

ACTI QQ QUARTER_DA
---- -- ----------
ACT1 Q4 11/15     
ACT2 Q4 10/21 

最后,要使用当前年份将季度转换为日期,请使用:

SELECT x.*
      , to_date( to_char( sysdate, 'yyyy' ) || '/' || QUARTER_DATE, 'yyyy/mm/dd' ) as my_date
FROM (
    SELECT * FROM ACTIVITIES
    UNPIVOT (
        Quarter_date FOR qq IN (Q1, Q2, Q3, Q4 )
    )
) x
WHERE QQ = 'Q4'
;

ACTI QQ QUARTER_DA MY_DATE  
---- -- ---------- ----------
ACT1 Q4 11/15      2016/11/15
ACT2 Q4 10/21      2016/10/21

<强> ---------- 编辑 ----------

Oracle 10没有UNPIVOT子句 要使用常规SQL对数据进行取消,必须使用UNION ALL子句,以这种方式:

SELECT ACTIVITY_NAME, 'Q1' As QQ, Q1 As QUARTER_DA FROM ACTIVITIES
UNION ALL
SELECT ACTIVITY_NAME, 'Q2' As QQ, Q2 As QUARTER_DA FROM ACTIVITIES
UNION ALL
SELECT ACTIVITY_NAME, 'Q3' As QQ, Q3 As QUARTER_DA FROM ACTIVITIES
UNION ALL
SELECT ACTIVITY_NAME, 'Q4' As QQ, Q4 As QUARTER_DA FROM ACTIVITIES