2017-08-14 5 views
0

J'ai des valeurs dans une table de faits comme suit:Peupler la date mensuelle de la date trimestrielle dans Oracle

As of Date F_Type  Value 
31-Mar-17 ABC Corp 1.0 
30-Jun-17 ABC Corp 1.1 

Au dates sont les dates de fin trimestre, maintenant je dois écrire une requête pour obtenir le résultat défini comme ci-dessous : (dates de fin de mois entre les dates après la valeur est modifiée)

As of Date F_Type  Value 
31-Mar-17 ABC Corp 1.0 
30-Apr-17 ABC Corp 1.0 
31-May-17 ABC Corp 1.0 
30-Jun-17 ABC Corp 1.1 

Comment puis-je remplir le 30-Apr-17 et 31-mai-17 lignes ??

code a essayé jusqu'à présent:

SELECT 
As_Of_Date, 
F_Type, 
Value,X.* 
FROM FACT F INNER JOIN 
(SELECT M_DATE,trunc(M_DATE+1,'Q')-1 AS QTR_DATE FROm 
(Select TO_DATE('31-JAN-2017','DD-MON-YYYY') AS M_DATE from dual UNION ALL 
Select TO_DATE('28-FEB-2017','DD-MON-YYYY') from dual UNION ALL 
Select TO_DATE('31-MAR-2017','DD-MON-YYYY') from dual UNION ALL 
Select TO_DATE('30-APR-2017','DD-MON-YYYY') from dual UNION ALL 
Select TO_DATE('31-MAY-2017','DD-MON-YYYY') from dual UNION ALL 
Select TO_DATE('30-JUN-2017','DD-MON-YYYY') from dual UNION ALL 
Select TO_DATE('31-JUL-2017','DD-MON-YYYY') from dual UNION ALL 
Select TO_DATE('31-AUG-2017','DD-MON-YYYY') from dual UNION ALL 
Select TO_DATE('30-SEP-2017','DD-MON-YYYY') from dual UNION ALL 
Select TO_DATE('31-OCT-2017','DD-MON-YYYY') from dual UNION ALL 
Select TO_DATE('30-NOV-2017','DD-MON-YYYY') from dual UNION ALL 
Select TO_DATE('31-DEC-2017','DD-MON-YYYY') from dual))X 
ON F.As_Of_Date=X.QTR_DATE 

Cela me donne quelque chose comme ci-dessous:

As of Date F_Type  Value M_Date Qtr_Date 
3/31/2017 ABC Corp 1.0 3/31/2017 3/31/2017 
3/31/2017 ABC Corp 1.0 4/30/2017 3/31/2017 
3/31/2017 ABC Corp 1.0 5/31/2017 3/31/2017 
6/30/2017 ABC Corp 1.1 6/30/2017 6/30/2017 
6/30/2017 ABC Corp 1.1 7/31/2017 6/30/2017 
6/30/2017 ABC Corp 1.1 8/31/2017 6/30/2017 

est-il un moyen de régler cette requête et de sortie ainsi.

Répondre

0

Je pense que la requête ci-dessous peut fonctionner pour vous, j'ai essayé avec votre table et vérifié la sortie.

SELECT * FROM FACT 
UNION 
SELECT ADD_MONTHS(AS_OF_DATE,LVL.LVL2) DT, 
      FACT.F_TYPE, 
      FACT.VALUE 
FROM FACT, 
     (SELECT LEVEL AS LVL2 
     FROM DUAL 
      CONNECT BY LEVEL<=2) LVL 
     ,(SELECT MAX(AS_OF_DATE) DT2 
      FROM FACT) FC2 
     WHERE ADD_MONTHS(AS_OF_DATE,LVL.LVL2)<=FC2.DT2 

J'ai pris l'ensemble de données ci-dessous:

As of Date F_Type  Value 
31-Mar-17 ABC Corp 1.0 
30-Jun-17 ABC Corp 1.1 
30-Sep-17 ABC Corp 1.2 

Ajouté la ligne pour tester l'authenticité septembre de ma requête.

et je reçois comme sortie:

As of Date F_Type  Value 
31-Mar-17 ABC Corp 1.0 
30-Apr-17 ABC Corp 1.0 
31-May-17 ABC Corp 1.0 
30-Jun-17 ABC Corp 1.1 
31-Jul-17 ABC Corp 1.1 
30-Aug-17 ABC Corp 1.1 
30-Sep-17 ABC Corp 1.2 

J'espère que c'est ce que vous cherchez.

+0

Vous devriez probablement utiliser 'last_day()' pour vous assurer que les dates générées se terminent le mois, car 30rh n'est pas le dernier jour de juillet. – APC

+0

Je n'ai pas collé l'ensemble de données de résultats de ma base de données, peut-être que je l'ai édité à la main, je vais corriger la réponse. Merci @APC de m'avoir informé. La question a supposé que les données seront de la fin du mois, donc j'ai utilisé add_months ce qui rend la date suivante aussi la fin du mois. – kratostoical

+0

Merci @kratostoical –