数据透视表是在数据分析时经常使用的,在Excel中使用十分方便,但有些场景也要在数据库实现类似的效果,以下是基于Oracle的SQL实现,相对于Excel功能还是略显麻烦
Excel原始数据
Excel数据透视表效果
Excel自动给日期做维度划分,划分成年、月、日期三个维度,可以在透视表中放置在行或列
SQL数据及代码
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方言)
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;