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;
