1. 多表连接统计分析
SELECT
d.department_name,
COUNT(e.employee_id) AS employee_count,
AVG(e.salary) AS avg_salary,
MAX(e.salary) AS max_salary,
MIN(e.salary) AS min_salary
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id
GROUP BY
d.department_name
ORDER BY
employee_count DESC;
此查询统计了各部门的员工数量、平均薪资、最高薪资和最低薪资,通过连接employees和departments表并按部门分组。
2. 时间相关的销售数据分析
SELECT
TO_CHAR(o.order_date, 'YYYY-MM') AS month,
c.customer_name,
SUM(oi.quantity * oi.unit_price) AS total_sales,
RANK() OVER (PARTITION BY TO_CHAR(o.order_date, 'YYYY-MM')
ORDER BY SUM(oi.quantity * oi.unit_price) DESC) AS sales_rank
FROM
orders o
JOIN
order_items oi ON o.order_id = oi.order_id
JOIN
customers c ON o.customer_id = c.customer_id
WHERE
o.order_date BETWEEN TO_DATE('2024-01-01', 'YYYY-MM-DD')
AND TO_DATE('2024-12-31', 'YYYY-MM-DD')
GROUP BY
TO_CHAR(o.order_date, 'YYYY-MM'), c.customer_name
HAVING
SUM(oi.quantity * oi.unit_price) > 10000
ORDER BY
month, sales_rank;
此分析展示了2024年每月销售额最高的客户,使用了多表连接、日期函数、窗口函数和分组过滤。
3. 产品性能随时间变化趋势
WITH monthly_sales AS (
SELECT
p.product_name,
TO_CHAR(o.order_date, 'YYYY-MM') AS month,
SUM(oi.quantity) AS total_quantity,
SUM(oi.quantity * oi.unit_price) AS total_revenue
FROM
products p
JOIN
order_items oi ON p.product_id = oi.product_id
JOIN
orders o ON oi.order_id = o.order_id
WHERE
o.order_date BETWEEN ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), -12)
AND LAST_DAY(ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -1))
GROUP BY
p.product_name, TO_CHAR(o.order_date, 'YYYY-MM')
)
SELECT
product_name,
month,
total_quantity,
total_revenue,
LAG(total_quantity, 1, 0) OVER (PARTITION BY product_name ORDER BY month) AS prev_month_quantity,
ROUND((total_quantity - LAG(total_quantity, 1, 0) OVER (PARTITION BY product_name ORDER BY month)) / NULLIF(LAG(total_quantity, 1, 1) OVER (PARTITION BY product_name ORDER BY month), 0) * 100, 2) AS quantity_growth_pct
FROM
monthly_sales
ORDER BY
product_name, month;
此查询分析了过去12个月各产品的销售数量和收入变化趋势,并计算了环比增长率。
4. 员工绩效综合统计
SELECT
e.employee_id,
e.first_name || ' ' || e.last_name AS employee_name,
d.department_name,
j.job_title,
COUNT(DISTINCT o.order_id) AS orders_processed,
NVL(SUM(oi.quantity * oi.unit_price), 0) AS total_sales_amount,
ROUND(NVL(SUM(oi.quantity * oi.unit_price), 0) /
NULLIF(COUNT(DISTINCT o.order_id), 0), 2) AS avg_order_value,
RANK() OVER (PARTITION BY d.department_id ORDER BY NVL(SUM(oi.quantity * oi.unit_price), 0) DESC) AS dept_sales_rank
FROM
employees e
LEFT JOIN
orders o ON e.employee_id = o.sales_rep_id
LEFT JOIN
order_items oi ON o.order_id = oi.order_id
JOIN
departments d ON e.department_id = d.department_id
JOIN
jobs j ON e.job_id = j.job_id
WHERE
o.order_date BETWEEN ADD_MONTHS(SYSDATE, -6) AND SYSDATE
OR o.order_id IS NULL
GROUP BY
e.employee_id, e.first_name, e.last_name, d.department_name, j.job_title, d.department_id
ORDER BY
total_sales_amount DESC NULLS LAST;
5. 数据库对象空间使用统计
SELECT
t.owner AS schema_name,
t.table_name,
t.num_rows,
ROUND(s.bytes/1024/1024, 2) AS size_mb,
TO_CHAR(t.last_analyzed, 'YYYY-MM-DD HH24:MI:SS') AS last_analyzed,
COUNT(c.column_id) AS column_count,
SUM(CASE WHEN c.nullable = 'Y' THEN 1 ELSE 0 END) AS nullable_columns,
SUM(CASE WHEN c.data_type IN ('DATE', 'TIMESTAMP') THEN 1 ELSE 0 END) AS date_columns
FROM
all_tables t
JOIN
all_segments s ON t.owner = s.owner AND t.table_name = s.segment_name
LEFT JOIN
all_tab_columns c ON t.owner = c.owner AND t.table_name = c.table_name
WHERE
t.owner = USER
AND t.last_analyzed > ADD_MONTHS(SYSDATE, -3)
GROUP BY
t.owner, t.table_name, t.num_rows, s.bytes, t.last_analyzed
ORDER BY
size_mb DESC;
此查询统计了当前用户模式下各表的空间使用情况、行数、列数等元数据信息,帮助进行数据库性能优化。
以上SQL示例涵盖了Oracle数据库中常用的统计分析方法,包括多表连接、分组聚合、窗口函数、日期处理等多种技术,可用于生成全面的数据库统计分析报告。
喜欢就关注我吧!以后给大家分享更多的学习内容