【MySQL笔记】行转列+列转行+行转列为什么用SUM()

文章目录

  • 行转列
    • 思路
    • 实现行转列
      • 为什么要用`SUM`等聚合函数
  • 列转行
    • 思路
      • 回顾下`Union`
    • 实现列转行
  • Reference

行转列

在这里插入图片描述

思路

GROUP BY+聚合函数

实现行转列

SELECT 
  product_id,
  SUM(IF(store = 'store1', price, NULL)) AS 'store1',
  SUM(IF(store = 'store2', price, NULL)) AS 'store2',
  SUM(IF(store = 'store3', price, NULL)) AS 'store3' 
FROM
  Products1 
GROUP BY product_id ;

case when...then...end也可以,SUM也可以换成MAXMIN等聚合函数

SELECT 
  product_id,
  MIN(CASE WHEN store = 'store1' THEN price END) AS 'store1',
  MIN(CASE WHEN store = 'store2' THEN price END) AS 'store2',
  MIN(CASE WHEN store = 'store2' THEN price END) AS 'store3' 
FROM
  Products1 
GROUP BY product_id ;

为什么要用SUM等聚合函数

大部分人可能都有这个疑惑,为什么还要加个聚合函数SUM在这

我们熟悉的聚合函数+GROUP BY的使用场景应该就是“统计各产品在所有store的总价/均价”之类,比如

SELECT product_id, SUM(price) FROM Products1 GROUP BY product_id

上面的语句中的执行顺序如下:

  1. FROM Products1`先把表读进来
+--------------+-------+--------+
| product_id   | store  | price |
+--------------+-------+--------+
| 0            | store1 | 95    |
| 1            | store1 | 70    |
| 0            | store2 | 100   |
| 1            | store2 | NULL  |
| 0            | store3 | 105   |
| 1            | store3 | 80    |
+--------------+----- --+-------+
  1. GROUP BY product_id把表中数据按product_id分组
+--------------+-------+--------+
| product_id   | store  | price |
+--------------+-------+--------+
| 0            | store1 | 95    |
| 0            | store2 | 100   |
| 0            | store3 | 105   |
+--------------+----- --+-------+
| 1            | store1 | 70    |
| 1            | store2 | NULL  |
| 1            | store3 | 80    |
+--------------+----- --+-------+
  1. 然后才是SELECT,其中SUM(price)计算各个分组price字段的总和(NULL不参与计算)
+--------------+------------+
| product_id   | SUM(price) |
+--------------+------------+
| 0            | 300        |
| 1            | 150        |

回到我们上面行转列的语句,我们只看一个字段先

SELECT 
  product_id,
  SUM(IF(store = 'store1', price, NULL)) AS 'store1'
FROM
  Products1 
GROUP BY product_id ;

执行流程跟上面查总价的类似:

  1. FROM Products1`先把表读进来
+--------------+-------+--------+
| product_id   | store  | price |
+--------------+-------+--------+
| 0            | store1 | 95    |
| 1            | store1 | 70    |
| 0            | store2 | 100   |
| 1            | store2 | NULL  |
| 0            | store3 | 105   |
| 1            | store3 | 80    |
+--------------+----- --+-------+
  1. GROUP BY product_id把表中数据按product_id分组
+--------------+--------+--------+
| product_id   | store  | price |
+--------------+-------+--------+
| 0            | store1 | 95    |
| 0            | store2 | 100   |
| 0            | store3 | 105   |
+--------------+----- --+-------+
| 1            | store1 | 70    |
| 1            | store2 | NULL  |
| 1            | store3 | 80    |
+--------------+----- --+-------+
  1. 此时,每个product_id的组里各有三条数据,我们现在只需要store1的price,因此需要IF(store = 'store1', price, NULL)进行过滤,不是store1的price全部当作NULL,而NULL不参与聚合函数运算,也就是说,这里SUM实际运算的对象只有一个数据,就是store1的price (product_id为1的组里为95,product_id为2的组里为70),所以这个聚合函数换成MIN也可以

列转行

在这里插入图片描述

思路

每次查一行,然后用union拼起来

回顾下Union

用于连接两个以上的 SELECT 语句的结果组合到一个结果集合,并去除重复的行

SELECT column1, column2, ...
FROM table1
WHERE condition1
UNION [ALL]
SELECT column1, column2, ...
FROM table2
WHERE condition2
[ORDER BY column1, column2, ...];
  • 操作中的列数和数据类型必须相同

  • UNION 操作符在合并结果集时会去除重复行,而 UNION ALL 不会去除重复行

  • union 连接的语句中只会出现一个order by (不包含子查询中的)

    select * from(select  *  from table order by a)
    union
    select * from (select * from table1 order by b)
    union
    select * from (select * from table2 order by c)
    order by d;
    
    • 多个order可以放在子查询
    select * from(select  *  from table order by a)
    union
    select * from (select * from table1 order by b)
    union
    select * from (select * from table2 order by c);
    

实现列转行

SELECT product_id, 'store1' store, store1 price FROM products WHERE store1 IS NOT NULL
UNION
SELECT product_id, 'store2' store, store2 price FROM products WHERE store2 IS NOT NULL
UNION
SELECT product_id, 'store3' store, store3 price FROM products WHERE store3 IS NOT NULL;

Reference

1795. 每个产品在不同商店的价格

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub:BROKEN: GALLERY

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb WEB wen信息收集 目录扫描 进制转换 ssh登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, M…

上位机图像处理和嵌入式模块部署(qmacvisual形状匹配)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在qmacvisual软件当中,提供了两种模板匹配的方法。除了前面介绍的灰度匹配,就是今天讲的形状匹配。当然,对于使…

AI如何影响装饰器模式与组合模式的选择与应用

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL应用》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀 转载自热榜文章:设计模式深度解析:AI如何影响…

【动手学深度学习】深入浅出深度学习之利用神经网络识别螺旋状数据集

目录 🌞一、实验目的 🌞二、实验准备 🌞三、实验内容 🌼1. 生成螺旋状数据集 🌼2. 打印数据集 🌼3. 编程实现 🌻仿射层-Affine类 🌻传播层-Sigmoid类 🌻损失函数…

[数据结构初阶]堆的应用

各位读者老爷好,鼠鼠又来了捏!鼠鼠上一篇博客介绍的堆,那么今天来浅谈以下堆的应用,那么好,我们先来看两个问题: 1.如果有一组乱序的数组数据,希望你将这组数组的数据排成升序或降序&#xff0c…

【Spring MVC】快速学习使用Spring MVC的注解及三层架构

💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Spring MVC】快速学习使用Spring MVC的注解及三层架构 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 Spring Web MVC一: 什么是Spring Web MVC&#xff1…

大促销活动时期如何做好DDoS防护?

每一次活动大促带来的迅猛流量,对技术人而言都是一次严峻考验。如果在活动期间遭受黑产恶意DDoS攻击,无疑是雪上加霜。电商的特性是业务常态下通常不会遭受大流量DDoS攻击,且对延迟敏感,因此只需要在活动期间按需使用DDoS防护。本…

分享three.js实现乐高小汽车

前言 Web脚本语言JavaScript入门容易,但是想要熟练掌握却需要几年的学习与实践,还要在弱类型开发语言中习惯于使用模块来构建你的代码,就像小时候玩的乐高积木一样。 应用程序的模块化理念,通过将实现隐藏在一个简单的接口后面&a…

代码随想录第二十四天| 回溯算法P1 | ● 理论基础 ● 77.

● 理论基础 题目分类 什么是回溯法 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 在二叉树系列中,不止一次提到了回溯,如二叉树:以为使用了递归,其实还隐藏着回溯 (opens new window)。 回溯是递归的副产品&…

通过pymysql读取数据库中表格并保存到excel(实用篇)

本篇文章是通过pymysql将本地数据库中的指定表格保存到excel的操作。 这里我们假设本地已经安装了对应的数据库管理工具,里面有一个指定的表格,现在通过python程序,通过调用pymysql进行读取并保存到excel中。 关于数据库管理工具是Navicat P…

使用Python简单筛选excel表数据并写入到新表

文章目录 0 背景1 技术2 实现代码 0 背景 因为需要检索excel中的一些信息,把检索后的结果,写入到新表中。 符合筛选后的结果: 写入到的新表格数据: 1 技术 使用pandas库,读取excel表格的数据。然后对表格中的数据…

初始Java篇(JavaSE基础语法)(5)(类和对象(下))

个人主页(找往期文章包括但不限于本期文章中不懂的知识点):我要学编程(ಥ_ಥ)-CSDN博客 目录 封装 访问限定符 封装扩展之包 自定义包 static成员 static修饰成员变量 static修饰成员方法 static成员变量初始化 内部类 对象的打…

leetcode131分割回文串

递归树 下面这个代码是遍历处所有的子串 #include <bits/stdc.h> using namespace std; class Solution { public:vector<vector<string>> vvs;vector<string> vs;vector<vector<string>> partition(string s) {dfs(0,s);return vvs;}vo…

使用Thymeleaf配置国际化页面

在国际化&#xff08;i18n&#xff0c;即 Internationalization 的缩写&#xff0c;其中“i”和“n”之间有18个字母&#xff09;的上下文中&#xff0c;Thymeleaf 和 Spring Boot 可以很容易地一起工作&#xff0c;以支持多种语言的页面显示。下面是如何在 Spring Boot 应用中…

Unix中的进程和线程-1

目录 1.如何创建一个进程 2.如何终止进程 2.2遗言函数 3.进程资源的回收 4.孤儿进程和僵尸进程 孤儿进程 (Orphan Process)&#xff1a; 僵尸进程 (Zombie Process)&#xff1a; 代码示例&#xff1a; 5. 进程映像的更新 在Linux中&#xff0c;进程和线程是操作系统进行工作调…

文件名目录名或卷标语法不正确:数据恢复策略与预防措施

一、文件名目录名或卷标语法不正确的现象 在日常使用电脑或移动设备时&#xff0c;我们经常会遇到“文件名目录名或卷标语法不正确”的错误提示。这种错误通常发生在尝试访问、修改或删除文件、目录或卷标时&#xff0c;系统会提示无法完成操作&#xff0c;因为文件名、目录名…

星云曲库测试报告

文章目录 一、项目介绍1.1项目背景1.2功能介绍 二、测试环境三、测试执行过程3.1功能测试3.1.1登录页面测试3.1.2歌曲列表页面测试3.1.3“我喜欢”页面测试3.1.4上传页面测试 3.2界面自动化测试3.2.1登录页面测试3.2.2歌曲列表页面测试3.2.3“我喜欢”页面测试3.2.4上传页面测试…

Unity TrailRenderer的基本了解

在Unity中&#xff0c;TrailRenderer组件用于在对象移动时创建轨迹效果。通常用于增强游戏中的动态物体&#xff0c;比如子弹、飞行道具或者角色移动时的拖尾效果。 下面来了解下它的基本信息。 1、创建 法1&#xff1a;通过代码创建 using UnityEngine;public class Trail…

css3之3D转换transform

css3之3D转换 一.特点二.坐标系三.3D移动&#xff08;translate3d)1.概念2.透视&#xff08;perpective)(近大远小&#xff09;&#xff08;写在父盒子上&#xff09; 四.3D旋转&#xff08;rotate3d)1.概念2.左手准则3.呈现&#xff08;transfrom-style)&#xff08;写父级盒子…

精品PPT-2023年无人驾驶汽车车联网网络安全方案

以下是部分PPT内容&#xff0c;请您参阅。如需下载完整PPTX文件&#xff0c;请前往星球获取&#xff1a; 无人驾驶安全架构是一个复杂的系统&#xff0c;它涉及到多个关键组件和层次&#xff0c;以确保无人驾驶车辆在各种情况下都能安全、可靠地运行。以下是一些主要的无人驾驶…