oracle 存儲過程 示例


oracle 存儲過程 示例

CreationTime--2018年9月4日09點49分

Author:Marydon

1.情景展示

  對VIRTUAL_QRCODELOG表的靜態二維碼,動態二維碼,二維碼總量按時間進行分組統計

  表結構展示

 

  存儲過程入參展示

2.sql分析

 要想完成這個sql需要將行轉成列

  第一步:

  第二步:借助UNION ALL

--按日期統計動態二維碼
SELECT TO_CHAR(QR_CREATETIME, 'yyyy-MM-dd') TIME,
       0 STATIC_CODE,
       COUNT(1) DYNAMIC_CODE
  FROM VIRTUAL_QRCODELOG
 WHERE QR_CODE_TYPE = 0
 GROUP BY TO_CHAR(QR_CREATETIME, 'yyyy-MM-dd')
UNION ALL
--按日期統計靜態二維碼
SELECT TO_CHAR(QR_CREATETIME, 'yyyy-MM-dd') TIME,
       COUNT(1) STATIC_CODE,
       0 DYNAMIC_CODE
  FROM VIRTUAL_QRCODELOG
 WHERE QR_CODE_TYPE = 1
 GROUP BY TO_CHAR(QR_CREATETIME, 'yyyy-MM-dd')
 ORDER BY TIME

  

  第三步:按日期進行分組求和

SELECT TIME, --時間
       SUM(STATIC_CODE) STATIC_CODE, --靜態二維碼
       SUM(DYNAMIC_CODE) DYNAMIC_CODE, --動態二維碼
       SUM(STATIC_CODE) + SUM(DYNAMIC_CODE) SCAN_CODE --掃碼
  FROM (
        --按日期統計動態二維碼
        SELECT TO_CHAR(QR_CREATETIME, 'yyyy-MM-dd') TIME,
                0 STATIC_CODE,
                COUNT(1) DYNAMIC_CODE
          FROM VIRTUAL_QRCODELOG
         WHERE QR_CODE_TYPE = 0
         GROUP BY TO_CHAR(QR_CREATETIME, 'yyyy-MM-dd')
        UNION ALL
        --按日期統計靜態二維碼
        SELECT TO_CHAR(QR_CREATETIME, 'yyyy-MM-dd') TIME,
                COUNT(1) STATIC_CODE,
                0 DYNAMIC_CODE
          FROM VIRTUAL_QRCODELOG
         WHERE QR_CODE_TYPE = 1
         GROUP BY TO_CHAR(QR_CREATETIME, 'yyyy-MM-dd'))
 GROUP BY TIME
 ORDER BY TIME;

3.存儲過程展示

CREATE OR REPLACE PROCEDURE CARD_COUNT_QRCODE(V_START    IN VARCHAR2, --開始時間
                                              V_END      IN VARCHAR2, --結束時間
                                              OUT_CURSOR OUT SYS_REFCURSOR) IS --系統游標
  /**
  * 內容:電子卡二維碼應用情況統計
  * 日期:2018/08/20
  * 作者:MARYDON
  * 版本:1.0
  */
  V_START_DATE VARCHAR2(19);
  V_END_DATE   VARCHAR2(19);
  V_DATEFORMAT VARCHAR2(10);--按日期進行分組格式
  --開始時間、結束時間拼接
  BEGIN
  IF (LENGTH(V_START) = 4) THEN
    --yyyy
    V_START_DATE := V_START || '-01-01 00:00:00';
    V_END_DATE   := V_END || '-12-31 00:00:00';
    V_DATEFORMAT := 'YYYY';
  ELSIF (LENGTH(V_START) = 7) THEN
    --yyyy-mm
    V_START_DATE := V_START || '-01 00:00:00';
    SELECT TO_CHAR(LAST_DAY(TO_DATE(V_END, 'YYYY-MM')), 'YYYY-MM-DD') ||
           ' 00:00:00'
      INTO V_END_DATE
      FROM DUAL;
    V_DATEFORMAT := 'YYYY-MM';  
  ELSE
    --yyyy-mm-dd
    V_START_DATE := V_START || ' 00:00:00';
    V_END_DATE   := V_END || ' 00:00:00';
    V_DATEFORMAT := 'YYYY-MM-DD';
  END IF;

  --業務執行
  OPEN OUT_CURSOR FOR
    SELECT TIME,--時間
           SUM(STATIC_CODE) STATIC_CODE, --靜態二維碼
           SUM(DYNAMIC_CODE) DYNAMIC_CODE, --動態二維碼
           SUM(STATIC_CODE) + SUM(DYNAMIC_CODE) SCAN_CODE --掃碼
      FROM (
            --按日期統計動態二維碼
            SELECT TO_CHAR(QR_CREATETIME, V_DATEFORMAT) TIME, 0 STATIC_CODE, COUNT(1) DYNAMIC_CODE
              FROM VIRTUAL_QRCODELOG
             WHERE QR_CODE_TYPE = 0
               AND QR_CREATETIME >=
                   TO_DATE(V_START_DATE, 'YYYY-MM-DD HH24:MI:SS')
               AND QR_CREATETIME <
                   (TO_DATE(V_END_DATE, 'YYYY-MM-DD HH24:MI:SS') + 1)
             GROUP BY TO_CHAR(QR_CREATETIME, V_DATEFORMAT)
            UNION ALL
            --按日期統計靜態二維碼
            SELECT TO_CHAR(QR_CREATETIME, V_DATEFORMAT) TIME, COUNT(1) STATIC_CODE, 0 DYNAMIC_CODE
              FROM VIRTUAL_QRCODELOG
             WHERE QR_CODE_TYPE = 1
               AND QR_CREATETIME >=
                   TO_DATE(V_START_DATE, 'YYYY-MM-DD HH24:MI:SS')
               AND QR_CREATETIME <
                   (TO_DATE(V_END_DATE, 'YYYY-MM-DD HH24:MI:SS') + 1)
             GROUP BY TO_CHAR(QR_CREATETIME, V_DATEFORMAT)
             )
        GROUP BY TIME
        ORDER BY TIME;
END CARD_COUNT_QRCODE; 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM