面试时遇到一个这样的sql题如下:
表sales
年份 | 季度 | 金额 |
1991 | 1 | 11 |
1991 | 2 | 22 |
1991 | 3 | 33 |
1991 | 4 | 44 |
1992 | 1 | 55 |
1992 | 2 | 66 |
1992 | 3 | 77 |
1992 | 4 | 88 |
查询结果如下:
年份 | 第一季度 | 第二季度 | 第三季度 | 第四季度 |
1991 | 11 | 22 | 33 | 44 |
1992 | 55 | 66 | 77 | 88 |
请写出sql语句。
当我看到这样的问题时我的内心是崩溃的,一点思路都没有!回到家赶紧查上网查了一下,记录备忘。
建表:
CREATE TABLE [dbo].[sales](
[id] [int] IDENTITY(1,1) NOT NULL,
[year] [int] NULL,
[jidu] [int] NULL,
[jine] [int] NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
有两种方法:
一、使用case when 实现:
SELECT
year as '年份',
max(CASE jidu WHEN 1 THEN jine END) AS '第一季度',
max(CASE jidu WHEN 2 THEN jine END) AS '第二季度',
max(CASE jidu WHEN 3 THEN jine END) AS '第三季度',
max(CASE jidu WHEN 4 THEN jine END) AS '第四季度'
FROM sales group by year
很容易理解,但写起来很麻烦。下面介绍下一种。
二、使用pivot函数:
使用pivot函数时须注意
对升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别设置为 90 或更高。
参考:
https://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx
PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。
PIVOT的语法:
SELECT <非透视的列>,
[第一个透视的列] AS <列名称>,
[第二个透视的列] AS <列名称>,
...
[最后一个透视的列] AS <列名称>,
FROM
(<生成数据的 SELECT 查询>)
AS <源查询的别名>
PIVOT
(
<聚合函数>(<要聚合的列>)
FOR
[<包含要成为列标题的值的列>]
IN ( [第一个透视的列], [第二个透视的列],
... [最后一个透视的列])
) AS <透视表的别名>
<可选的 ORDER BY 子句>;
按照上述语法写出sql:
select year as 年份,[1] as 第一季度,[2] as 第二季度,[3] as 第三季度,[4] as 第四季度 from sales pivot (SUM(jine) FOR jidu IN ([1],[2],[3],[4]))a
看着就清秀,执行结果如下:
这是什么鬼……
其实很明显,分组出现了问题,但是按照语法
只能指定需要横向显示的列即聚合函数中的列和要成为列标题的值的列,不能明确定义分组列。用作分组的列是PIVOT函数中没有应用到的列(即 字段 id),会根据id和year两个字段分组。
注意源查询中是可以使用select语句的,PIVOT可以操作结果集,因此只需要将源查询中不显示id这个字段就可以了:
select year as 年份,[1] as 第一季度,[2] as 第二季度,[3] as 第三季度,[4] as 第四季度 from (select year,jidu,jine from sales) as t1 pivot (SUM(jine) FOR jidu IN ([1],[2],[3],[4])) as a --'t1'和'a'这两个别名必须得有要不会报错。
执行结果:
终于对了。
- 大小: 7 KB
- 大小: 3.6 KB
分享到:
相关推荐
### SQL语句实现表的行列转换,行转列,列转行 在处理数据库时,我们经常需要对数据进行各种变换以适应不同的分析需求。其中,“行列转换”就是一种非常实用的功能,它可以帮助我们将表中的行数据转换为列数据,...
精典的SQL语句,行转列,列转行的语句 本文共分六个部分,分别讨论精典的SQL语句,行转列,列转行的语句,行列转换、取得数据表的所有列名、更改用户密码、判断表的哪些字段不允许为空、找到含有相同字段的表六个...
MySQL 虽然没有内置的行转列和列转行函数,但通过 CASE、GROUP_CONCAT、UNION ALL 和 JOIN 等 SQL 语句,我们可以灵活地对数据进行转换,满足不同的数据分析需求。在实际应用中,应根据数据的特性和业务需求选择合适...
知识点3:使用动态 SQL 语句实现数据转换 在存储过程中,我们使用动态 SQL 语句来实现数据转换。动态 SQL 语句是一种可以根据需要生成的 SQL 语句。在这个示例中,我们使用 `CONCAT` 函数来构建动态 SQL 语句,以...
在SQL(结构化查询语言)中,行转列是一种常见的数据转换操作,它将数据库表中的多行数据转换为单列或多列显示。这在数据分析、报表制作或数据展示时非常有用。本教程将深入探讨如何在SQL中实现这一功能。 首先,...
本文主要介绍一种利用SQL语句中的`UNION ALL`来实现“行转列”的方法,并通过具体的示例代码进行详细解释。 #### 基本概念理解 1. **UNION ALL**:在SQL中,`UNION`用于合并两个或多个`SELECT`语句的结果集,但会...
在本案例中,我们主要探讨如何使用SQL语句,尤其是存储过程,来实现动态的行转列功能。这在处理具有多个分类或时间序列的数据时特别有用,可以更直观地展示数据。 首先,我们需要创建一个存储过程来执行这个操作。...
本主题聚焦于如何利用SQL语句在易语言环境中为超级列表框添加合计行,这是一项能显著提高代码效率和易读性的技巧。 超级列表框是GUI(图形用户界面)设计中常见的一种组件,它允许用户以表格形式展示和操作数据,...
在SQL Server 2000中,我们可以使用CASE WHEN语句和MAX聚合函数来实现行转列操作。下面是一个示例代码: ```sql select 姓名 as 姓名, max(case 课程 when '语文' then 分数 else 0 end) 语文, max(case 课程 ...
根据提供的标题、描述、标签及部分内容,本文将详细介绍SQL中实现列转行及行转列通用存储过程的具体方法,特别是针对Microsoft SQL Server版本的应用场景。 ### 标题解析:SQL列转行及行转列的通用存储过程 该标题...
除了Pivot,还可以使用CASE语句结合GROUP BY来实现行转列。CASE语句可以用来根据条件返回不同的值,非常适合处理分类数据。以下是一个基本示例: ```sql SELECT column1, SUM(CASE WHEN condition1 THEN value END...
案例还展示了使用动态SQL来实现行转列的另一种方法。这种方法通过构建一个动态的SQL查询语句,可以处理任意数量的列转换,而无需手动为每列编写`CASE`语句。其核心代码如下: ```sql DECLARE @sql VARCHAR(8000); ...
在不支持Pivot或者不想使用动态SQL的情况下,可以利用CASE语句实现行转列。这种方法比较繁琐,需要为每列写一个CASE语句,但依然能达成目的。 ```sql SELECT ProductID, MAX(CASE WHEN Year = 2018 THEN Sales...
本文将详细介绍SQL语句中实现行转列的三种方法,帮助你在处理数据时更加灵活。 1. 静态行转列 静态行转列通常适用于列名已知且固定的情况。这种方法利用`CASE`语句配合`SUM`函数来完成转换。在给出的例子中,我们...
动态方式是指通过动态生成SQL语句来实现行转列的功能。这种方法适用于列名未知或者列的数量不确定的情况。动态方式可以极大地提高灵活性,但同时也增加了代码复杂性和潜在错误的可能性。 **示例代码**: ```sql ...
1. **构建动态SQL语句**:首先,需要查询出所有需要被转换为列的值,并基于这些值构造动态SQL。 2. **执行动态SQL**:接着,使用`EXEC`命令执行之前构建好的动态SQL。 示例代码如下: ```sql DECLARE @sql VARCHAR...
SQL 语句行列转换是数据库管理系统中的一种常见操作,它可以将数据从行转换为列,或者从列转换为行。在这个过程中,需要使用数据库管理语言(Database Management Language,DML)来实现数据的转换。下面我们将详细...
本文将深入探讨如何通过Oracle中的存储过程实现动态“行转列”,并结合给定文件的信息,详细解析其工作原理、优点及应用场景。 ### 核心知识点:Oracle动态行转列 #### 1. 存储过程与动态SQL 存储过程是预编译的...