写点什么

数据库每日一题 --- 第 24 天:格式化部门表

作者:知心宝贝
  • 2022 年 7 月 16 日
  • 本文字数:1349 字

    阅读完需:约 4 分钟

数据库每日一题---第24天:格式化部门表

一、问题描述

部门表 Department


+---------------+---------+| Column Name   | Type    |+---------------+---------+| id            | int     || revenue       | int     || month         | varchar |+---------------+---------+(id, month) 是表的联合主键。这个表格有关于每个部门每月收入的信息。月份(month)可以取下列值 ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]。
复制代码


编写一个 SQL 查询来重新格式化表,使得新的表中有一个部门 id 列和一些对应 每个月 的收入(revenue)列。


查询结果格式如下面的示例所示:


题目链接格式化部门表

二、题目要求

样例

Department 表:+------+---------+-------+| id   | revenue | month |+------+---------+-------+| 1    | 8000    | Jan   || 2    | 9000    | Jan   || 3    | 10000   | Feb   || 1    | 7000    | Feb   || 1    | 6000    | Mar   |+------+---------+-------+
查询得到的结果表:+------+-------------+-------------+-------------+-----+-------------+| id | Jan_Revenue | Feb_Revenue | Mar_Revenue | ... | Dec_Revenue |+------+-------------+-------------+-------------+-----+-------------+| 1 | 8000 | 7000 | 6000 | ... | null || 2 | 9000 | null | null | ... | null || 3 | null | 10000 | null | ... | null |+------+-------------+-------------+-------------+-----+-------------+
注意,结果表有 13 列 (1个部门 id 列 + 12个月份的收入列)。
复制代码

考察

1.聚合函数、case语句2.建议用时10~25min
复制代码

三、问题分析

题目要求我们求出每个用户编号在12个月的工资,没有工资的置为null,注意题目中每一行包含重复的编号,输出的结果包含id应该有 13 列。


这一题我们可以用


case  变量 when  条件  then  结果1 else  结果2
复制代码


这样的代码前来处理,对于每个月总体的薪资,先对id编号进行聚合分组,然后使用sum函数计算每个月薪资的总和。

四、编码实现

select id,    sum(case month when 'Jan' then revenue else null end) as Jan_Revenue,    sum(case month when 'Feb' then revenue else null end) as Feb_Revenue,    sum(case month when 'Mar' then revenue else null end) as Mar_Revenue,    sum(case month when 'Apr' then revenue else null end) as Apr_Revenue,    sum(case month when 'May' then revenue else null end) as May_Revenue,    sum(case month when 'Jun' then revenue else null end) as Jun_Revenue,    sum(case month when 'Jul' then revenue else null end) as Jul_Revenue,    sum(case month when 'Aug' then revenue else null end) as Aug_Revenue,    sum(case month when 'Sep' then revenue else null end) as Sep_Revenue,    sum(case month when 'Oct' then revenue else null end) as Oct_Revenue,    sum(case month when 'Nov' then revenue else null end) as Nov_Revenue,    sum(case month when 'Dec' then revenue else null end) as Dec_Revenuefrom Departmentgroup by id
复制代码

五、测试结果




发布于: 刚刚阅读数: 3
用户头像

知心宝贝

关注

公众号:穿越计算机的迷雾 2022.03.07 加入

生于尘埃 溺于人海 死于理想高台

评论

发布
暂无评论
数据库每日一题---第24天:格式化部门表_数据库_知心宝贝_InfoQ写作社区