numéros de Construire une table à la volée dans Oracle
-
12-10-2019 - |
Question
Comment puis-je retourner un ensemble de lignes comprenant les quatre dernières années, en fonction de la date actuelle?
Si cette requête se exécute sur 12/31/2010 il devrait revenir:
2007
2008
2009
2010
Mais si elle est exécutée sur 1/1/2011, il doit revenir:
2008
2009
2010
2011
Voici ce que j'ai commencé avec, deux requêtes qui retournent l'année de départ. Je préfère la seconde pour me convertir à la chaîne se sent sale bits.
SELECT TO_CHAR(TRUNC(sysdate, 'YY') - INTERVAL '3' YEAR, 'YYYY') FROM DUAL;
SELECT EXTRACT (YEAR FROM sysdate) - 3 FROM DUAL;
Mais je ne sais pas comment générer des lignes à chair cela. Dans I SQL Server utilise un CTE voudrais comme dans
La solution Voici une façon: Ou: Ou: SELECT yr
FROM ( SELECT EXTRACT (YEAR FROM (ADD_MONTHS ( SYSDATE, - ( (LEVEL - 1) * 12)))) yr
FROM DUAL
CONNECT BY LEVEL <= 4)
ORDER BY yr;
SELECT yr
FROM ( SELECT EXTRACT (YEAR FROM sysdate) - (level -1 ) yr
FROM DUAL
CONNECT BY LEVEL <= 4)
ORDER BY yr;
SELECT yr
FROM (SELECT EXTRACT (YEAR FROM SYSDATE) - (x - 1) yr
FROM DUAL
MODEL
DIMENSION BY (1 AS z)
MEASURES (1 x)
RULES
ITERATE (4)
(x [ITERATION_NUMBER] = ITERATION_NUMBER + 1))
ORDER BY yr;
Autres conseils
Pour nombre d'affichage de 1 à 100:
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= 100
ORDER BY LEVEL
Pour modifier le maximum, changer dans la troisième ligne.
Tout comme la réponse acceptée, vous pouvez remplacer la vue en ligne avec la clause. Je trouve l'article avec plus lisible. En particulier si vous allez effectuer plusieurs calculs contre la sur la volée table NUMÉROS dans le cadre de la même requête - l'intégralité de l'instruction SQL est plus lisible
.Tableau de nombres à la volée:
WITH NUMBERS_START_AT_ZERO AS
(SELECT LEVEL - 1 AS NUM
FROM DUAL
CONNECT BY LEVEL <= 4
order by NUM desc)
SELECT EXTRACT (YEAR FROM sysdate) - NUM AS YEARS
FROM NUMBERS_START_AT_ZERO
Sortie:
YEARS
2009
2010
2011
2012