问题陈述:
我有一个名为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的新手,我想向你们学习。非常感谢您的帮助。提前谢谢你。
答案 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