数据库纵表变横表

面试遇到的,没做出来。

原始表: 

name            course              score 
----------------------------------------- 
张三            语文                80 
张三            数学                75 
张三            外语                60 
李四            语文                90 
李四            数学                85 
李四            外语                70 
王五            语文                95 
王五            数学                80 
王五            外语                75 


结果表: 

姓名        语文        数学        外语 
----------------------------------------- 
张三        80          75          60 
李四        90          85          70 
王五        95          80          75 

========================================= 

方法一:select name, sum(case when course = "语文" then score else 0 end) "语文",
sum(case when course = "数学" then score else 0 end) "数学",
sum(case when course = "外语" then score else 0 end) "外语" 
from table1 group by name;

方法二:SELECT name,SUM(DECODE(course,'语文',score,0)),SUM(DECODE(course,'数学',score,0)),SUM(DECODE(course,'外语',score,0)) from tb1 GROUP BY name;

方法三:select name,max(case when course='语文' then score end) "语文",
max(case when course='数学' then score end) "数学",
max(case when course='外语' then score end) "外语" 
from table_name group by name;

------------------------------------------------------------------------------------------------

另:

原始表: 
city          volume 
--------------------- 
北京          16000 
东莞          5000 
上海          200000 
广州          8500 
湛江          100000 


结果表: 
城市          排名 
--------------------- 
北京          3 
东莞          5 
上海          1 
广州          4 
湛江          2

方法一:select city, row_number() over(order by volume desc) "排名" from table2;

方法二:SELECT city "城市",rownum "排名" from tb2 ORDER BY volume DESC

方法三:select city "城市",row_number() over(order by volume desc) as "排名" from tb2 order by rowid;


注:1、SUM 函数返回数值列的总数(总额);

 2、开窗函数row_number() over() 

row_number() over ([partition by col1] order by col2) ) as 别名
表示根据col1分组,在分组内部根据 col2排序
而这个“别名”的值就表示每组内部排序后的顺序编号(组内连续的唯一的),[partition by col1] 可省略。

ROW_NUMBER() OVER (ORDER BY pubtime desc) AS RowNumber

其实就是根据pubtime的大小排序,然后将RowNumber标上行号。

一般此方法多用与高效率分页


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纵表转横表是指将关系型数据库中的纵向存储的数据转换为向存储的形式。在MySQL中,可以使用一些SQL语句和技巧来实现这个转换。 一种常见的方法是使用PIVOT(透视)操作来完成纵表转横表的过程。在MySQL中,没有内置的PIVOT函数,但可以借助CASE WHEN语句和聚合函数来实现类似的功能。 下面是一个示例,假设有一个名为"employees"的表,其中包含了员工的姓名、部门和工资信息: ``` CREATE TABLE employees ( id INT, name VARCHAR(50), department VARCHAR(50), salary DECIMAL(10, 2) ); INSERT INTO employees (id, name, department, salary) VALUES (1, 'John', 'HR', 5000.00), (2, 'Jane', 'Marketing', 6000.00), (3, 'Mike', 'Sales', 7000.00), (4, 'Alice', 'HR', 5500.00); ``` 要将这个纵表转换为横表,以部门为列,员工姓名为行,工资为值,可以使用以下SQL查询: ``` SELECT name, MAX(CASE WHEN department = 'HR' THEN salary ELSE NULL END) AS HR, MAX(CASE WHEN department = 'Marketing' THEN salary ELSE NULL END) AS Marketing, MAX(CASE WHEN department = 'Sales' THEN salary ELSE NULL END) AS Sales FROM employees GROUP BY name; ``` 这个查询使用了CASE WHEN语句将每个部门的工资转换为对应的列,并使用了MAX函数来获取每个员工在不同部门的工资。GROUP BY子句按照员工姓名进行分组。 执行以上查询,将会得到如下结果: ``` +-------+---------+------------+-------+ | name | HR | Marketing | Sales | +-------+---------+------------+-------+ | Alice | 5500.00 | NULL | NULL | | Jane | NULL | 6000.00 | NULL | | John | 5000.00 | NULL | NULL | | Mike | NULL | NULL | 7000.00 | +-------+---------+------------+-------+ ``` 以上就是使用MySQL中的SQL语句实现纵表转横表的方法之一。当然,根据具体的数据结构和需求,可能需要针对性地调整SQL语句来实现更复杂的转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值