2017-07-30 50 views
-1

我有一個ID設置爲年和月的列。在PL/SQL中聲明/設置變量Oracle 11

例如:ID:201706其中'2017'是年份,'06'是月份,月份和年份隨着新數據被添加到表格中而變化。

我想設置一個變量,以便查詢中的where子句從當前月份的數據中提取數據。也想比較一下去年/月的金額。

如何在同一列中編寫一個查詢聲明yearmonth(201706)的查詢?

+0

「當月的數據」是如何定義的?有列嗎?什麼是數據類型?這與如何在PL/SQL中聲明/設置變量有關嗎? –

回答

0

如果你需要得到被檢索剛剛從一列

DECLARE 
    l_month NUMBER; // declaring variable of type number; 
    BEGIN 
     SELECT SUBSTR(column, 5) //will return last 2 digits, which is month 
     INTO l_month // getting value from select clause 
     FROM table 
     WHERE ...; 
    END; 

如果需要檢索多行

DECLARE 
     TYPE l_month_type IS TABLE OF NUMBER; // collection of type NUMBER 
     l_month l_month_type; // instance of collection 
    BEGIN 
     SELECT SUBSTR(column, 5) //will return last 2 digits, which is month 
     BULK COLLECT INTO l_month // getting data into collection 
     FROM table 
     WHERE ...; 
    END; 
0

希望這下面的代碼片段幫助。

WITH TEMP_DATA AS 
    (SELECT '201601' ID,100 QTY FROM DUAL 
    UNION ALL 
    SELECT '201601' ID,200 QTY FROM DUAL 
    UNION ALL 
    SELECT '201602' ID,101 QTY FROM DUAL 
    UNION ALL 
    SELECT '201603' ID,102 QTY FROM DUAL 
    UNION ALL 
    SELECT '201604' ID,103 QTY FROM DUAL 
    UNION ALL 
    SELECT '201605' ID,104 QTY FROM DUAL 
) 
SELECT TO_DATE(ID,'YYYYMM'), 
    COUNT(1) 
FROM TEMP_DATA 
GROUP BY TO_DATE(ID,'YYYYMM') 
ORDER BY TO_DATE(ID,'YYYYMM'); 

-----------------------Comparing data Reporting Purpose-------------------------------- 

SELECT * 
FROM 
    (WITH TEMP_DATA AS 
    (SELECT '201601' ID,100 QTY FROM DUAL 
    UNION ALL 
    SELECT '201601' ID,200 QTY FROM DUAL 
    UNION ALL 
    SELECT '201602' ID,101 QTY FROM DUAL 
    UNION ALL 
    SELECT '201603' ID,102 QTY FROM DUAL 
    UNION ALL 
    SELECT '201604' ID,103 QTY FROM DUAL 
    UNION ALL 
    SELECT '201605' ID,104 QTY FROM DUAL 
) 
SELECT ID,QTY FROM TEMP_DATA 
) PIVOT (COUNT(QTY) FOR ID IN ('201601','201602','201603','201604','201605'));