将连接的字符串转换为 Oracle 中的列名 SQL
Convert Concatenated String to Column Name in Oracle SQL
问题陈述:
我有一个名为 ACTIVITIES 的 table,所有列的数据类型均为 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 |
有了这个 table,我想根据系统日期获取当前季度到 select 特定行并将季度数据转换为日期。截至目前,我有这个查询,但错误提示说在我真正熟悉的预期数字的地方发现了一个非数字字符。
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';
现在,我正在寻求有关如何将连接的字符串转换为列名的帮助,以便我提取当前季度的特定数据以及特定的 activity。
预期结果:
查询:
select to_date(Q4, 'MM/DD')
from activities
where activity_name = 'ACT2';
-- to_date() 函数中的 Q4 参数现在被视为列名,而不是字符串。如上面的问题陈述所述,如何将 Q4 字符串参数转换为列名,以便获得下面的输出。
输出:08/06/2016
我是 oracle 的新手 sql,我想向你们学习。非常感谢您的帮助。提前谢谢你。
最简单的方法是先对数据进行逆透视:
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
问题陈述:
我有一个名为 ACTIVITIES 的 table,所有列的数据类型均为 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 |
有了这个 table,我想根据系统日期获取当前季度到 select 特定行并将季度数据转换为日期。截至目前,我有这个查询,但错误提示说在我真正熟悉的预期数字的地方发现了一个非数字字符。
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';
现在,我正在寻求有关如何将连接的字符串转换为列名的帮助,以便我提取当前季度的特定数据以及特定的 activity。
预期结果:
查询:
select to_date(Q4, 'MM/DD')
from activities
where activity_name = 'ACT2';
-- to_date() 函数中的 Q4 参数现在被视为列名,而不是字符串。如上面的问题陈述所述,如何将 Q4 字符串参数转换为列名,以便获得下面的输出。
输出:08/06/2016
我是 oracle 的新手 sql,我想向你们学习。非常感谢您的帮助。提前谢谢你。
最简单的方法是先对数据进行逆透视:
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