2016-11-20 9 views
0

Постановка задача:Преобразование сцепленной строки в столбец Имени в Oracle SQL

У меня есть таблица с именем деятельность с всеми столбцами, имеющим тип данных 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 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'; 

- параметр Q4 внутри функции to_date() в настоящее время рассматривается как имя столбца, а не строки. Как уже упоминалось выше в описании проблемы, как я могу преобразовать этот параметр строки Q4 в имя столбца, чтобы я мог получить результат ниже.

Выход: 08/06/2016

Я новичок в Oracle SQL, и я хотел бы узнать у вас, ребята. Очень ценю вашу помощь. Заранее спасибо.

ответ

0

Самый простой способ заключается в первую UNPIVOT ваши данные:

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 

---------- EDIT ----------

У Oracle 10 нет предложения UNPIVOT.
Для 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 
+0

Спасибо, я получил вашу точку в настоящее время. Но на самом деле у меня есть ошибка в части, которая говорит, что SQL не закончилась должным образом. Незлая помощь. Спасибо. –

+0

В настоящее время я использую oracle 10g. –

+0

Я обновил ответ на примере, как отключить данные в Oracle 10 – krokodilko

 Смежные вопросы

  • Нет связанных вопросов^_^