BI-SQL丨行列转换

2023-11-17

行列转换
行列转换,在SQL Server中属于常见的基本操作。无论是搭建数仓,还是通过PowerBI进行数据分析,我们总会接触到各式各样的数据源,而在这些数据源中,除了标准的大型数仓外,我们很少能够拿到标准规范的数据表结构。
接触最多的,往往是大宽表,这就需要我们将大宽表转换为标准的二维表结构,即实现表结构的降维操作,也就是PowerBI中的透视功能。
函数介绍

PIVOT语法:

PIVOT (
  < 聚合函数 >(要聚合的列) FOR < 转换的列 > IN (转换的列的值列表)
) AS 转换后的表名

UNPIVOT语法:

UNPIVOT (
  < 聚合函数 >(要聚合的列) FOR < 转换的列 > IN (转换的列的值列表)
) AS 转换后的表名

PIVOT函数,通常用来将表结构从二维表转换为大宽表,而UNPIVOT则恰恰相反,通常是用来将大宽表转换为二维表。
使用实例

案例数据:

在白茶的本机数据库中,存在名为CaseData的数据库,存在名为“Test1”的二维表和名为“Test2”大宽表。
例子1:
将二维表,转换为大宽表。

SELECT
    *
FROM
    Test1 PIVOT (
        SUM(Sales) FOR Product IN (女装, 男装, 童装, 鞋子, 裤子)
    ) AS NewTable

结果如下:

当然,除了PIVOT函数以外,我们还可以使用常规的计算方法。

SELECT
    日期,
    SUM(
        CASE
            WHEN Product = N'女装' THEN Sales
            ELSE 0
        END
    ) AS '女装',
    SUM(
        CASE
            WHEN Product = N'男装' THEN Sales
            ELSE 0
        END
    ) AS '男装',
    SUM(
        CASE
            WHEN Product = N'童装' THEN Sales
            ELSE 0
        END
    ) AS '童装',
    SUM(
        CASE
            WHEN Product = N'鞋子' THEN Sales
            ELSE 0
        END
    ) AS '鞋子',
    SUM(
        CASE
            WHEN Product = N'裤子' THEN Sales
            ELSE 0
        END
    ) AS '裤子'
FROM
    Test1
GROUP BY
    日期

结果如下:

例子2:
将大宽表,转换为二维表。

SELECT
    *
FROM
    Test2 UNPIVOT (
        Sales FOR Product IN (女装, 男装, 童装, 鞋子, 裤子)
    ) AS NewTable

结果如下:

同理,除了UNPIVOT函数以外,列转行也是有其他办法的。

SELECT
    日期,
    N'女装' AS "Product",
    女装 AS Sales
FROM
    Test2
UNION
SELECT
    日期,
    N'男装' AS "Product",
    男装 AS Sales
FROM
    Test2
UNION
SELECT
    日期,
    N'童装' AS "Product",
    童装 AS Sales
FROM
    Test2
UNION
SELECT
    日期,
    N'鞋子' AS "Product",
    鞋子 AS Sales
FROM
    Test2
UNION
SELECT
    日期,
    N'裤子' AS "Product",
    裤子 AS Sales
FROM
    Test2

结果如下:

这里是白茶,一个PowerBI的初学者。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BI-SQL丨行列转换 的相关文章

  • 如何使用 SQL 查询在 Access 中的字段上设置验证规则?

    我正在使用 MS Access 2016 Office 365 目前遇到问题 下面是一个演示此问题的示例 这里我创建了一个表 名为节点家庭链接 由两个字段组成 NodeID 和 FamilyID 如下所示 现在 NodeID 是从另一个表
  • PostgreSQL Age() 函数:在不同月份登陆时出现不同/意外的结果

    今天 我在 PostgreSQL 9 6 中运行此查询时遇到了无法解释的结果 SELECT age 2018 06 30 2018 05 19 AS one age 2018 07 01 2018 05 20 AS two 两列的预期结果
  • 递归 SQL 给出 ORA-01790

    使用 Oracle 11g 第 2 版 以下查询给出 ORA 01790 表达式必须与相应表达式具有相同的数据类型 with intervals time interval AS select trunc systimestamp from
  • Sql Server:如何在 WHERE 子句中使用 MAX 等聚合函数

    我想获得该记录的最大值 请帮我 SELECT rest field1 FROM mastertable AS m INNER JOIN SELECT t1 field1 field1 t2 field2 FROM table1 AS T1
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 创建表作为 select 删除 postgresql 中的非空约束

    在 postgres sql 中 创建表时 select 删除了表上的非空约束 例如 对此没有单一命令的解决方案 要基于现有表 包括所有约束 创建表 请使用 create table B like a including constrain
  • 如何授予所有表的 REFERENCES 权限

    我必须授予REFERENCES登录权限说sql login 我可以给予资助REFERENCES对单个表的权限 例如 GRANT REFERENCES ON Mytable TO sql login 有什么办法可以授予REFERENCES允许
  • 如何查找 PostgreSQL 数据库的上次更新时间?

    我正在使用一个批量更新的 postgreSQL 数据库 我需要知道数据库 或数据库中的表 上次更新或修改的时间 两者都可以 我看到 postgreSQL 论坛上有人建议使用日志记录并查询日志 这对我不起作用 因为我无法控制客户端代码库 你可
  • 模式更新后 jOOQ 生成的类的运行时验证?

    我用org jooq util DefaultGenerator在构建过程中生成 jOOQ 类来表示我的数据库模式 当应用程序运行时 架构预计会在应用程序不知情的情况下发生更改 此类更改可能与已生成的代码兼容 也可能不兼容 如何在运行时检测
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • 如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式

    我正在使用 MySQL 的 LOAD DATA LOCAL INFILE SQL 语句将数据从 CSV 文件加载到现有数据库表中 下面是一个 SQL 语句示例 LOAD DATA LOCAL INFILE file csv INTO TAB
  • 如何在Oracle中使用Timestamp_to_scn和Scn_to_timestamp?

    我的查询结果是这样的 select cast to date a start time mm dd yyyy hh mi ss pm as timestamp date of call ora rowscn from calling tab
  • 复选框上的数据绑定

    我目前正在将数据从 SQL 数据库之一提取到我的应用程序中 我可以让它适用于我的文本框和其他项目 但是 我似乎无法让它适用于复选框 这是我正在使用的代码 DataTable dt new DataTable dt using SqlConn
  • 如何使用PostGIS将多边形数据转换为线段

    我在 PostgreSQL PostGIS 中有一个多边形数据表 现在我需要将此多边形数据转换为其相应的线段 谁能告诉我如何使用 PostGIS 查询进行转换 提前致谢 一般来说 将多边形转换为线可能并不简单 因为没有一对一的映射 http
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 如何在 PostgreSQL 中使用具有多个值的 SQL LIKE 条件?

    有没有更短的方法来查找多个匹配项 SELECT from table WHERE column LIKE AAA OR column LIKE BBB OR column LIKE CCC 这个问题适用于 PostgreSQL 9 1 但如
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样

随机推荐

  • 【最新最详细】SQL Server 2019 安装教程

    最新最详细 SQL Server 2019 安装教程 引言 今天又双叒搞新电脑的环境 对于我这个 Net程序员 那就肯定离不开安装 SQL Server 了 网上没有找到很详细的教程 所以决定自己再写一份 下面直接进入主题 下载SQL Se
  • 基于 Matlab 的 RLS 算法进行时间序列预测

    基于 Matlab 的 RLS 算法进行时间序列预测 时间序列分析在许多领域中都具有重要的应用价值 例如金融 经济 气象等 时间序列预测是其中的一个关键问题 其目的是根据过去一段时间的观测值来预测未来一段时间的值 在本文中 我们将介绍如何使
  • Vue中安装less-loader报错处理

    Vue中使用less 需要安装less loader 1 安装命令 npm install less loader 需要注意的是less loader版本需要和webpack版本对应 版本不对会报错 webpack 4 使用 less lo
  • 【ML on Kubernetes】第 10 章:构建、部署和监控模型

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 从主机备份ubuntu到虚拟机的坑

    系统用的是16 04 1 备份过程 直接采用这个方法 不过我是直接用的镜像 data放在U盘 没有做成启动U盘 参考链接1 问题就来了 直接挂载镜像使用的是CD ROM 可能出现权限问题无法修改 记住要提前把必要的文件保存在虚拟机的系统下
  • Python自动化测试专栏——选择元素基本方法之CSS选择器

    CSS选择器选择元素 1 根据 tag名选择元素 选择 所有的tag名为div的元素 wd find elements by css selector div 2 根据id属性选择元素 wd find element by css sele
  • tensorflow如何更新到最新的版本

    背景 前面在anaconda中使用tensorflow时 在深度学习目标检测的那方面出现了问题 提示 no op 当你在百度上百度这个错误的时候 很多的CSDN博主会告诉你是因为你的tensorflow版本过低 准备 那就是更新tensor
  • MySQL——习题:每个部门当前员工最高薪水

    有一个员工表dept emp简况如下 有一个薪水表salaries简况如下 获取所有部门中员工薪水最高的相关信息 给出dept no emp no以及其对应的salary 按照部门编号升序排列 以上例子输出如下 解法1 SELECT d1
  • 移植Qt4.8.4项目到QT5.2上时遇到的一些问题

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 问题1 Qt 5 2 使用原来的QT4 8 4项目时QWebView QWebFrame等类无法编译通过 出现原因 QWebView QWebFrame QWebPage
  • OJ: 蛇形矩阵 螺旋矩阵

    题目描述 题目说明 在一个N N的方阵中 填入1 2 N共N个数 并要求构成如下的格式 N lt 10 例 输入描述 多组数据 每行读入一个N 输出描述 对应输出N N的蛇形矩阵 每个数字占3格子 每个蛇形矩阵之间用空行分割 输入样例 3
  • 【Git】git pull总是要输入账号和密码

    git config global credential helper store 之后再次执行git push 或者git pull这时候只需要在输入一次用户名和密码下次就不需要了 这个命令则是在你的本地生成一个账号密码的记录 这样就不用
  • Python中执行MySQL语句, 遇到同时有单引号, 双引号处理方式 !r, repr()

    SQL语句 insert cmd INSERT INTO 0 SET 1 format db conn firmware info table join 0 1 r format k str v for k v in info dict i
  • linux读取按行读写文本文件

    include
  • 迪杰斯特拉算法浅析

    所谓的迪杰斯特拉算法 就是一个用来求一个图中某点到其它点的最短路径的算法 大致方法 遍历所有节点 找到离起点最近的一个点 那么这个点到起点的最小距离肯定是起点到这个点的这条边的权值 然后标记这个点被使用过了 以1中的那个点为中继 更新其它节
  • 进程和线程的区别

    简介 进程 进程是计算机中运行程序的实例 是操作系统进行资源分配和调度的基本单位 每个进程都有独立的内存空间和系统资源 不同进程之间相互独立 彼此不能直接访问对方的内存 进程之间的通信需要通过操作系统提供的特定机制 如管道 共享内存等 个人
  • nginx 之安全配置

    前言 看官网官网 一 控制并发连接数 1 在默认发布目录新建一个目录并保存一张图片 传送文件到server1 打开浏览器就能看到图片 2 测试 查看日至情况 cat usr local nginx logs access log http状
  • 时间计时android程序,Android实现时间倒计时功能

    本文实例为大家分享了Android实现时间倒计时功能展示的具体代码 供大家参考 具体内容如下 效果展示 MainActivity 主页面代码 public class MainActivity extends Activity privat
  • Nacos配置中心落地与实践

    一 背景 目前 我们公司各团队配置中心使用各异 电商使用的是 Spring Cloud Config 支付使用的是 Apollo APP 团队使用的是 Apollo Nacos 为了更好地应对公司业务的发展 统一基础设施技术栈必不可少 图片
  • ChatGPT-Next-Web:Vercel 和 Cloudflare 的快速部署

    项目地址 GitHub Chanzhaoyu chatgpt web 用 Express 和 Vue3 搭建的同时支持 openAI Key 和 网页 accessToken 的 ChatGPT 演示网页 依赖安装 1 安装node cur
  • BI-SQL丨行列转换

    行列转换 行列转换 在SQL Server中属于常见的基本操作 无论是搭建数仓 还是通过PowerBI进行数据分析 我们总会接触到各式各样的数据源 而在这些数据源中 除了标准的大型数仓外 我们很少能够拿到标准规范的数据表结构 接触最多的 往