Oracle行专列的几种方法

1.创建表t_result

create table t_result

(d varchar2(10),result varchar2(4));

2.往表中插入数据

insert into t_result values ('2014-01-01','胜');

insert into t_result values ('2014-01-01','胜');

insert into t_result values ('2014-01-01','负');

insert into t_result values ('2014-01-02','胜');

insert into t_result values ('2014-01-02','负');

insert into t_result values ('2014-01-02','负');

 

select * from t_result;

解决办法一:

select t1.d,t1.c1 胜,t2.c2 负 from

(select count(result) c1,d from t_result where result = '胜' group by d) t1

LEFT outer join

(select count(result) c2,d from t_result where result = '负' group by d) t2

on t1.d = t2.d;

解决办法二:-----推荐方法

select * from t_result pivot (count(result) for result in('胜','负'))

解决办法三:

SELECT d,SUM(decode(result,'胜',1,0)),SUM(decode(result,'负',1,0))

FROM t_result

GROUP BY d

解决办法四:

select d,

sum(case result when '胜' then 1 else 0 end )胜,

sum(case result when '负' then 1 else 0 end )负

from t_result group by d order by d;

取自:https://www.cnblogs.com/markfeifei/p/4009343.html

自己做过测试,然后外加一种方法

 

例子二:

CREATE TABLE studentScores
(
userName varchar(20),
subject varchar(30),
score FLOAT
);
INSERT INTO studentScores(username,subject,score) values( '张三', '语文', 80);
INSERT INTO studentScores values ('张三', '数学', 90);
INSERT INTO studentScores values ('张三', '英语', 70);
INSERT INTO studentScores values ('张三', '生物', 85);
INSERT INTO studentScores values ('李四', '语文', 80);
INSERT INTO studentScores values ('李四', '数学', 92);
INSERT INTO studentScores values ('李四', '英语', 76);
INSERT INTO studentScores values ('李四', '生物', 88);
INSERT INTO studentScores values ('码农', '语文', 60);
INSERT INTO studentScores values ('码农', '数学', 82);
INSERT INTO studentScores values ('码农', '英语', 96);
INSERT INTO studentScores values ('码农', '生物', 78);
select * from studentScores;

select username,WM_CONCAT(score),SUM(SCORE) from studentScores group by username;

解决办法一:

SELECT KIN.*,
KIN.a+KIN.b AS TOTAL
FROM
(SELECT *
FROM studentScores PIVOT (sum(SCORE) FOR subject IN ('语文' AS A , '数学' AS B) )
) KIN;

解决办法二:
SELECT
username,
MAX(DECODE(subject, '语文', SCORE)) A,
MAX(DECODE(subject, '数学', SCORE)) B,
MAX(DECODE(subject, '英语', SCORE)) C,
MAX(DECODE(subject, '生物', SCORE)) D,
SUM(SCORE) TOTAL
FROM
studentScores
GROUP BY
username;

转载于:https://www.cnblogs.com/fengxiaoyuan/p/9982033.html

### 回答1: Oracle专列不定列(also known as Oracle pivot/unpivot)是指在Oracle数据库中通过数据透视(pivot)和逆数据透视(unpivot)的方式来实现将数据转换为列数据或将列数据转换为数据的操作。 在进数据透视操作时,需要使用Oracle的PIVOT子句。该子句会将原始的数据按照某个列进聚合,并将其转换为新的列。例如,可以按照某个日期列对销售数据进聚合,将每个日期作为新的列,统计该日期下的销售量。这样一来,每个日期就会对应一个新的列,方便查看和分析数据。 相反,在进逆数据透视操作时,需要使用Oracle的UNPIVOT子句。该子句会将原始的列数据按照某种方式进展开,并将其转换为新的。例如,可以将某个表的多个列进展开,每个新的代表原始表中的一组列数据。这样可以方便进数据的比较和分析。 Oracle专列不定列的功能在数据分析和报表生成中非常有用。它可以提供更直观和方便的数据展示方式,更方便地进数据分析和决策。然而,使用专列不定列功能也需要谨慎,避免数据丢失或产生错误的结果。 总之,Oracle专列不定列是一种非常强大的数据操作方式,可以在数据展示和分析中发挥重要作用,提供更方便和直观的数据呈现方式。在使用时,需要根据具体的需求和数据情况选择合适的方法,并注意数据的准确性和一致性。 ### 回答2: Oracle专列不定列是指在查询结果中,是固定的,列的数量和名称不确定,根据查询条件和数据内容来确定。 在Oracle数据库中,我们可以使用动态SQL语句来实现专列不定列的查询。动态SQL语句可以根据不同的条件和数据内容来动态生成SQL查询语句,从而获取不同的结果。 例如,我们想要查询不同销售人员的销售额,但是销售人员的数量和名称是根据数据库中的数据而定的。我们可以使用动态SQL语句来实现这个查询。 首先,我们可以写一个基础的SQL查询语句,来获取所有销售人员的销售额: SELECT salesperson, SUM(sales_amount) AS total_sales FROM sales_table GROUP BY salesperson; 然后,我们可以使用PL/SQL的游标和循环语句来动态生成列的名称和数量。在每次循环中,我们可以使用EXECUTE IMMEDIATE语句来执动态生成的SQL语句,并将结果存储在一个临时表中。 最后,我们可以使用SELECT语句来从临时表中获取最终的查询结果,其中列的数量和名称是动态生成的。 总之,Oracle专列不定列是一种动态查询方式,可以根据条件和数据内容来生成不确定数量和名称的列,从而实现灵活的查询需求。通过使用动态SQL语句和PL/SQL的特性,我们可以方便地实现这种查询方式。 ### 回答3: Oracle专列是指在查询语句中以为单位返回结果,每一包含一条完整的记录,每个记录的各列值是确定的。而不定列是指查询语句中返回的记录的列数不确定,在不同查询时可能包含不同的列。 在Oracle中,常用的专列查询语句是使用SELECT语句从表中获取数据。例如,可以使用以下语句从名为"employees"的表中检索姓名、年龄和部门的信息: SELECT name, age, department FROM employees; 这将返回一系列记录,每个记录都包含姓名、年龄和部门。每个记录在中,各列的值是确定的。 相比之下,不定列查询可能会根据不同的查询条件返回不同的列。例如,可以使用以下语句获取某个特定部门的员工信息和其所在的工作项目: SELECT name, project FROM employees WHERE department = 'IT'; 在这个查询中,根据查询条件,返回的记录列包括员工姓名和所在项目。如果查询条件发生改变,可能会返回不同的列。 总之,Oracle专列查询是返回确定列的数据记录,而不定列查询可以根据不同的查询条件返回不同的列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值