【实例】用SQL实现Excel数据透视表的效果

760 阅读1分钟

数据透视表是在数据分析时经常使用的,在Excel中使用十分方便,但有些场景也要在数据库实现类似的效果,以下是基于Oracle的SQL实现,相对于Excel功能还是略显麻烦

Excel原始数据

image.png

Excel数据透视表效果

image.png

Excel自动给日期做维度划分,划分成年、月、日期三个维度,可以在透视表中放置在行或列

SQL数据及代码

image.png

SELECT 
    T.D_DATE AS DATE_TIME, 
    T.SUBJECT_CODE AS NAV
FROM T_GZB T
WHERE 
    T.BH_ZT = 8001
	AND T.SUBJECT_CODE = '基金单位净值:'
ORDER BY T.D_DATE ASC;

SQL数据透视效果及代码(Oracle方言)

image.png

SELECT 
    V_YEAR,
	AVG(FIRST_QUARTER) AS AVG_1_Q,
	AVG(SECOND_QUARTER) AS AVG_2_Q,
	AVG(THIRD_QUARTER) AS AVG_3_Q,
	AVG(FORTH_QUARTER) AS AVG_4_Q
FROM (
    WITH SQL_VIEW AS (
    SELECT 
        EXTRACT(YEAR FROM DATE_TIME) || '年' YEAR,
		CASE
		    WHEN EXTRACT(MONTH FROM DATE_TIME) IN
				(1, 2, 3) THEN '第一季度'
		    WHEN EXTRACT(MONTH FROM DATE_TIME) IN
				(4, 5, 6) THEN '第二季度'
		    WHEN EXTRACT(MONTH FROM DATE_TIME) IN
				(7, 8, 9) THEN '第三季度'
		    WHEN EXTRACT(MONTH FROM DATE_TIME) IN
				(10, 11, 12) THEN '第四季度'
		END AS QUARTER,
		EXTRACT(MONTH FROM DATE_TIME) || '月' MONTH,
		NAV
		FROM (
            SELECT 
                T.D_DATE AS DATE_TIME,
				T.SUBJECT_CODE AS NAV
			FROM T_GZB T
			WHERE T.BH_ZT = 8001
			AND T.SUBJECT_CODE = '基金单位净值:'
			ORDER BY T.D_DATE ASC) A)
SELECT 
    T.YEAR AS V_YEAR,
	CASE
		WHEN QUARTER = '第一季度' THEN NAV
		ELSE NULL
	END AS FIRST_QUARTER,
	CASE
		WHEN QUARTER = '第二季度' THEN  NAV
		ELSE NULL
	END AS SECOND_QUARTER,
	CASE
		WHEN QUARTER = '第三季度' THEN NAV
		ELSE NULL
	END AS THIRD_QUARTER,
	CASE
		WHEN QUARTER = '第四季度' THEN NAV
		ELSE NULL
	END AS FORTH_QUARTER
FROM SQL_VIEW T) A
GROUP BY V_YEAR;