SQL中PIVOT函数的用法

文章目录

  • 前言
  • 1. SQL Server
  • 2. MySQL
  • 3. Oracle


前言

PIVOT 是 SQL Server 中的一个功能,用于将行转换为列。然而,MySQL 和 Oracle 不直接支持 PIVOT 语法。但是,你可以使用条件聚合或其他技术来模拟 PIVOT 的行为。

语法:

-- 从子查询中选择数据,子查询从源表中选择需要的数据  
SELECT ...    
FROM     (  -- 源查询,从源表中选取你希望进行PIVOT操作的列  SELECT ...    FROM <source_table>  -- 可以包含WHERE子句、GROUP BY子句等以筛选或组织数据  ) AS SourceTable    -- PIVOT操作,将行数据转换为列数据  
PIVOT    (  -- 聚合函数,用于计算每个新列的值  aggregate_function(<column_value>)    -- 指定要进行转换的列名  FOR <column_name>     -- 指定转换后新列的名称列表  IN ([first_pivoted_column], [second_pivoted_column], ...)  ) AS PivotTable;

以下是如何在 SQL Server、MySQL 和 Oracle 中实现类似 PIVOT 的操作的示例。

1. SQL Server

假设你有一个名为 sales 的表,其中包含 year, product, 和 amount 三个字段:

sql:

CREATE TABLE sales (  year INT,  product VARCHAR(50),  amount DECIMAL(10, 2)  
);  INSERT INTO sales (year, product, amount) VALUES  
(2020, 'A', 100),  
(2020, 'B', 200),  
(2021, 'A', 150),  
(2021, 'B', 250);

你可以使用 PIVOT 来转换数据:

SELECT *  
FROM (  SELECT year, product, amount  FROM sales  
) AS source_table  
PIVOT (  SUM(amount)  FOR product IN ([A], [B])  
) AS pivot_table;

这将返回:

yearAB
2020100.0200.0
2021150.0250.0

2. MySQL

在 MySQL 中,你可以使用条件聚合来模拟 PIVOT:

SELECT year,  SUM(CASE WHEN product = 'A' THEN amount ELSE 0 END) AS 'A',  SUM(CASE WHEN product = 'B' THEN amount ELSE 0 END) AS 'B'  
FROM sales  
GROUP BY year;

这将返回与 SQL Server 相同的结果。

3. Oracle

在 Oracle 中,你也可以使用条件聚合:

SELECT year,  SUM(CASE WHEN product = 'A' THEN amount ELSE 0 END) AS "A",  SUM(CASE WHEN product = 'B' THEN amount ELSE 0 END) AS "B"  
FROM sales  
GROUP BY year;

这将返回与 SQL Server 和 MySQL 相同的结果。

请注意,虽然上述查询在逻辑上模拟了 PIVOT 的行为,但它们并不是真正的 PIVOT 语法。如果你需要在多个列或动态列上进行转换,那么你可能需要构建更复杂的查询或使用存储过程来动态生成 SQL。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式:开放-封闭原则(Open-Closed Principle,OCP)介绍

开放-封闭原则&#xff08;Open-Closed Principle&#xff0c;OCP&#xff09;是面向对象设计原则之一&#xff0c;它指导我们编写可扩展和易维护的代码。该原则的核心思想是&#xff1a; 软件实体&#xff08;类、模块、函数等&#xff09;应该对扩展开放&#xff0c;对修改封…

Anagrams

描述 Most crossword puzzle&#xff08;猜字谜&#xff09; fans are used to anagrams&#xff08;字谜&#xff09;--groups of words with the same letters in different orders--for example OPTS, SPOT, STOP, POTS and POST. Some words however do not have this att…

【C++】位图

文章目录 1. 位图概念2. 位图的实现3. 位图的应用 1. 位图概念 面试题 给 40 亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这 40 亿个数中。 遍历&#xff0c;时间复杂度 O(N) 排序 O(NlogN)&#xff0c;利用二分查找&…

全志ARM-官方库SDK安装和验证

进入界面&#xff0c;输入以下指令 git clone https://github.com/orangepi-xunlong/wiringOP //下载源码 cd wiringOP //进入文件夹 sudo ./build clean //清除编译信息 sudo ./build …

leetCode58. 最后一个单词的长度

leetCode58. 最后一个单词的长度 思路&#xff1a;从末端使用双指针算法 代码 /* 我们采用双指针算法: 从后往前找&#xff0c;第一个指针是最后一个不是空格的字符 第二个指针指向的是前面空格的后一个字符 长度即为 i - j */ class Solution { public:int lengthOfLastWord(…

C++ | Leetcode C++题解之第40题组合总和II

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<pair<int, int>> freq;vector<vector<int>> ans;vector<int> sequence;public:void dfs(int pos, int rest) {if (rest 0) {ans.push_back(sequence);return;}if (pos fr…

前端JS必用工具【js-tool-big-box】,防抖和节流的方法调用学习

这一小节&#xff0c;我们针对前端工具包&#xff08;npm&#xff09;js-tool-big-box的使用做一些讲解&#xff0c;主要是防抖和节流方面的。 目录 前言 1 安装和引入 2 防抖的调用学习 3 节流的调用学习 4 使用方法总结 前言 在前端项目中&#xff0c;经常涉及到防抖…

使用Redis实现延时队列

redis的zset实现延迟队列 延迟队列是什么&#xff1f; 延时队列相比于普通队列最大的区别就体现在其延时的属性上&#xff0c;普通队列的元素是先进先出&#xff0c;按入队顺序进行处理&#xff0c;而延时队列中的元素在入队时会指定一个延迟时间&#xff0c;表示其希望能够在经…

多数据源注解使用

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> </dependency> 1.使用mybatis-plus 如何配置多数据源&#xff0c;application-loc…

vue使用海康控件开发包——浏览器直接查看海康监控画面

1、下载控件开发包 2、安装插件&#xff08;双击/demo/codebase/HCWebSDKPlugin.exe进行安装&#xff09; 3、打开/demo/index.html文件 4、在页面上输入你的海康监控的登录信息进行预览 如果有监控画面则可以进行下面的操作 注意&#xff1a;以下操作都在Vue项目进行 5、复…

静态链接lib库使用

lib库实际上分为两种&#xff0c;一种是静态链接lib库或者叫做静态lib库&#xff0c;另一种叫做动态链接库dll库的lib导入库或称为lib导入库。这两个库是不一样的&#xff0c;很多人都分不清楚&#xff0c;很容易混淆。 第一种是静态lib&#xff0c;包含了所有的代码实现的&am…

android studio集成 百度云推送项目实战 注意事项

onBind errorCode0(成功码) appid8543666(appid后台生成) userId1107752540659249906(用户Id) channelId3723987107990995031 requestId1268411415 1.首先查看应用包名是否一致 2.查看key是否一致 <meta-data android:name“api_key” android:value“KRxGMFpmQkXEgZDGG…

python 自动操作电脑

目录 python 模拟点击,在指定位置输入文字 模拟鼠标右键 一、pyautogui是什么 <

Centos 5 的yum源

背景 有使用较老的Centos 5 系统内部安装软件无法正常报错&#xff0c;是由于系统叫老yum源存在问题 处理方法 更换下述yum源&#xff0c;可以将其他repo源文件备份移动到其他目录&#xff0c;添加下述源后重新测试 [C5.11-base] nameCentOS-5.11 baseurlhttp://vault.c…

Electron vue 进程间消息通行

在 Electron 应用中&#xff0c;IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09;是一种允许主进程&#xff08;main process&#xff09;和渲染进程&#xff08;renderer process&#xff09;之间交换数据的方式。 ipcRenderer.send 在渲染进程…

Jackson 2.x 系列【31】Spring Boot 集成之字典回写

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 场景描述2. 案例演示2.1 修改枚举2.2 定义注解…

Gitflow实操以及代码审查Pull Request操作

1.背景 之前一直有用过gitflow&#xff0c;但是一直没有归纳技术&#xff0c;另一方面也是每个团队用到的gitflow都不一致。而最近做项目要用gitflow&#xff0c;趁此机会分享一下gitflow的操作。 2.gitflow介绍 用git一直有一个问题&#xff0c;就是怎么保证代码稳定性&…

服务器如何开启远程连接?

服务器开启远程连接是网络管理中一项重要的功能。通过远程连接&#xff0c;用户可以在任何地方远程访问服务器&#xff0c;从而进行管理、维护和监控等操作。远程连接的开启可以为工作提供便利性和效率&#xff0c;但同时也带来了安全风险。确保远程连接的安全性和可靠性是至关…

RPC的介绍和架构发展

RPC概念&#xff1a; RPC是远程过程调用协议&#xff0c;是一种不需要了解底层网络技术&#xff0c;调用远程计算机服务。 RPC框架的组成&#xff1a; 图1 当总项目的数据量、访问量不断提高&#xff0c;就把他分成多个服务&#xff0c;减轻单体机器的压力。分开的ABC服务之…

python高阶函数:zip()

概述与基本用法 zip() 是 Python 内置函数之一&#xff0c;用于将多个可迭代对象打包成一个元组序列&#xff0c;然后返回一个迭代器。它可以接受任意数量的可迭代对象作为参数&#xff0c;并将它们的元素按顺序一一对应地打包成元组。 以下是 zip() 函数的基本用法&#xff…