使用SQL行转列函数pivot遇到的问题

背景:对投票的结果按照单位进行汇总统计,数据库中表记录的各个账号对各个选项的投票记录。马上想到一个解决方案,先根据单位和选项进行Group By,然后再行转列得出单位对各个选项的投票情况。

with list as (
    select GroupId,ANSWER,count(1) as num from Vote GROUP BY GroupId,ANSWER
)
select * from list pivot(sum(num) for Answer in (1,2,3,4,5,6)) pvt

PS:数据库中记录的投票选项是1 2 3这样的,果然无意中就留下了一个坑!

1676882-20190613112607264-1895035032.png

一脸懵逼,为啥别人的demo都跑的这么流畅啊!这个报错提示也没什么头绪!没办法还是要硬着头皮上啊!然后网上就各种pivot关键字找找找!哎,突然发现有人在sql中对pivot中列名部分用[]将各个列名包起来了。恍然大悟,这个报错不就是列名或者说字段名不能直接用数字开头!!!赶紧改一下,一切ok!!!

with list as (
    select GroupId,ANSWER,count(1) as num from Vote GROUP BY    GroupId,ANSWER
)
select * from list pivot(sum(num) for Answer in ([1],[2],[3],[4],[5],[6])) pvt

1676882-20190613112624800-1986523650.png

转载于:https://www.cnblogs.com/cplemom/p/11015161.html

### Oracle 数据库PIVOT 函数的用法详解 PIVOT 是 Oracle 提供的一种用于实现行转列的功能,能够简化复杂查询并提高数据展示的效果。以下是关于其具体使用方法以及示例说明。 #### 基本语法结构 PIVOT 的基本语法可以描述为: ```sql SELECT * FROM table_name PIVOT ( 聚合函数(column_to_aggregate) FOR column_to_pivot IN (value1, value2, ...) ); ``` 其中: - `table_name` 是源表名称。 - `聚合函数` 可以是 SUM、COUNT、AVG 等,用来处理需要被汇总的数据[^2]。 - `column_to_aggregate` 是需要进行聚合操作的目标列。 - `column_to_pivot` 是指定要旋转成列的关键字段。 - `(value1, value2, ...)` 列出了目标列的具体取值范围。 #### 示例教程 假设有一个员工薪资记录表 `emp_salary`,包含以下三列:`employee_id`, `department`, 和 `salary`。现在希望通过 PIVOT 实现按部门统计每位员工总薪水的结果: ##### 创建测试数据 首先创建一张简单的表格来模拟实际场景: ```sql CREATE TABLE emp_salary ( employee_id NUMBER, department VARCHAR2(50), salary NUMBER ); INSERT INTO emp_salary VALUES (1, 'HR', 5000); INSERT INTO emp_salary VALUES (2, 'Finance', 6000); INSERT INTO emp_salary VALUES (3, 'IT', 7000); INSERT INTO emp_salary VALUES (4, 'HR', 8000); INSERT INTO emp_salary VALUES (5, 'Marketing', 9000); COMMIT; ``` ##### 查询语句 通过 PIVOT 对上述数据执行行转列的操作: ```sql SELECT * FROM emp_salary PIVOT ( SUM(salary) -- 计算每组内的总计数 FOR department IN ('HR' AS HR_Department, 'Finance' AS Finance_Department, 'IT' AS IT_Department, 'Marketing' AS Marketing_Department) ); ``` 此查询会返回如下结果: | EMPLOYEE_ID | HR_DEPARTMENT | FINANCE_DEPARTMENT | IT_DEPARTMENT | MARKETING_DEPARTMENT | |-------------|---------------|--------------------|----------------|-----------------------| | 1 | 5000 | NULL | NULL | NULL | | 2 | NULL | 6000| NULL | NULL | | 3 | NULL | NULL | 7000| NULL | | 4 | 8000 | NULL | NULL | NULL | | 5 | NULL | NULL | NULL | 9000| 以上展示了如何利用 PIVOT 将不同部门对应的薪资产生新的列[^4]。 #### 综合应用案例 如果希望进一步扩展功能,比如计算各部门工资的小计和合计,则可以通过嵌套子查询完成更复杂的逻辑运算。例如下面的例子演示了基于职位分类对各个部门工资总额做进一步分析的过程: ```sql WITH pivot_data AS ( SELECT deptno, job, sal FROM emp ) SELECT *, NVL("10", 0)+NVL("20", 0)+NVL("30", 0)+NVL("40", 0) Total_Sum FROM pivot_data PIVOT ( SUM(sal) FOR deptno IN (10 AS "10", 20 AS "20", 30 AS "30", 40 AS "40") ); ``` 该脚本不仅实现了基础的行列互换还增加了额外的一列用于存储所有部门加总的数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值