2016-11-20 3 views
0

Problem Statement:Konvertieren verketteten String Spaltennamen in Oracle SQL

Ich habe eine Tabelle mit dem Namen AKTIVITäTEN mit allen Spalten unten einen Datentyp von varchar (20) mit:

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

Mit diesem Ich möchte das aktuelle Quartal basierend auf dem Systemdatum abrufen, um eine bestimmte Zeile auszuwählen und die Quartalsdaten in das Datum zu konvertieren. Ab jetzt habe ich diese Abfrage, aber ein Fehler wird aufgefordert zu sagen, dass ein nicht-numerisches Zeichen gefunden wurde, wo eine numerische erwartet wurde, die mir eigentlich bekannt ist.

Das Ergebnis der concat() - Funktion ist eine Zeichenfolge, die unten angezeigt wird, deshalb gibt es eine Fehleraufforderung. Jetzt

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

, Ich suche nach Hilfe, wie die verkettete Zeichenfolge auf einen Spaltennamen zu konvertieren, um für mich, dass bestimmte Daten auf dem laufenden Quartal zu extrahieren und mit der spezifischen Aktivität.

Erwartetes Ergebnis:

Abfrage:

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

- Q4 Parameter innerhalb to_date() Funktion nun als Spaltenname betrachtet wird, nicht als String. Wie oben in der Problembeschreibung erwähnt, wie kann ich diesen Q4-String-Parameter in einen Spaltennamen konvertieren, so dass ich die Ausgabe unten erhalten kann.

Ausgabe: 08/06/2016

Ich bin neu in Oracle SQL und ich möchte von euch lernen. Schätze wirklich deine Hilfe. Vielen Dank im Voraus.

Antwort

0

Der einfachste Weg ist es, zunächst Entpivotisierung Ihrer Daten:

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

Sie ein Ergebnis wie folgt erhalten:

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  

Und nun eine Zeile für jedes Quartal Kommissionierung ist sehr einfach, zum Beispiel wenn Sie Q4 benötigen, fügen Sie einfach WHERE QQ='Q4' Zustand:

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 

Und finaly, ein Viertel bis ein Datum mit laufendem Jahr verwenden zu konvertieren:

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 hat keine UNPIVOT-Klausel. jetzt

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

Danke, ich habe Ihre Nummer:
Um reguläre SQL, UNION ALL Klausel verwendet werden müssen, auf diese Weise UNPIVOT Daten. Aber ich habe tatsächlich einen Fehler im Unpivot-Teil, der besagt, dass SQL nicht ordnungsgemäß beendet wurde. Freundlich helfen. Vielen Dank. –

+0

Im Moment mit Orakel 10g. –

+0

Ich habe die Antwort mit einem Beispiel aktualisiert, wie Sie Daten in Oracle 10 entpivotieren können – krokodilko

Verwandte Themen