当前位置: 首页 > 编程笔记 >

Microsoft SQL Server 简单的PIVOT和UNPIVOT(T-SQL)

鲁波光
2023-03-14
本文向大家介绍Microsoft SQL Server 简单的PIVOT和UNPIVOT(T-SQL),包括了Microsoft SQL Server 简单的PIVOT和UNPIVOT(T-SQL)的使用技巧和注意事项,需要的朋友参考一下

示例

以下是一个简单的示例,显示了每个工作日每个项目的平均价格。

首先,假设我们有一个表格,其中每天记录着所有物品的价格。

CREATE TABLE tbl_stock(item NVARCHAR(10), weekday NVARCHAR(10), price INT);

INSERT INTO tbl_stock VALUES 
('Item1', 'Mon', 110), ('Item2', 'Mon', 230), ('Item3', 'Mon', 150), 
('Item1', 'Tue', 115), ('Item2', 'Tue', 231), ('Item3', 'Tue', 162), 
('Item1', 'Wed', 110), ('Item2', 'Wed', 240), ('Item3', 'Wed', 162), 
('Item1', 'Thu', 109), ('Item2', 'Thu', 228), ('Item3', 'Thu', 145), 
('Item1', 'Fri', 120), ('Item2', 'Fri', 210), ('Item3', 'Fri', 125),
('Item1', 'Mon', 122), ('Item2', 'Mon', 225), ('Item3', 'Mon', 140),
('Item1', 'Tue', 110), ('Item2', 'Tue', 235), ('Item3', 'Tue', 154),
('Item1', 'Wed', 125), ('Item2', 'Wed', 220), ('Item3', 'Wed', 142);

该表应如下所示:

+========+=========+=======+
|   item | weekday | price |
+========+=========+=======+
|  Item1 |    Mon  |   110 |
+--------+---------+-------+
|  Item2 |    Mon  |   230 |
+--------+---------+-------+
|  Item3 |    Mon  |   150 |
+--------+---------+-------+
|  Item1 |    Tue  |   115 |
+--------+---------+-------+
|  Item2 |    Tue  |   231 |
+--------+---------+-------+
|  Item3 |    Tue  |   162 |
+--------+---------+-------+
|          . . .           |
+--------+---------+-------+
|  Item2 |    Wed  |   220 |
+--------+---------+-------+
|  Item3 |    Wed  |   142 |
+--------+---------+-------+

为了执行汇总以查找每个工作日的平均价格,我们将使用关系运算符PIVOT将weekday表值表达式的列旋转为汇总行值,如下所示:

SELECT * FROM tbl_stock
PIVOT ( 
    AVG(price) FOR weekday IN ([Mon], [Tue], [Wed], [Thu], [Fri])
) pvt;

结果:

+--------+------+------+------+------+------+
|  item  |  Mon |  Tue |  Wed |  Thu |  Fri |
+--------+------+------+------+------+------+
|  Item1 |  116 |  112 |  117 |  109 |  120 |
|  Item2 |  227 |  233 |  230 |  228 |  210 |
|  Item3 |  145 |  158 |  152 |  145 |  125 |
+--------+------+------+------+------+------+

最后,为了执行的反向操作PIVOT,我们可以使用关系运算符UNPIVOT将列旋转为行,如下所示:

SELECT * FROM tbl_stock
PIVOT ( 
    AVG(price) FOR weekday IN ([Mon], [Tue], [Wed], [Thu], [Fri])
) pvt
UNPIVOT ( 
    price FOR weekday IN ([Mon], [Tue], [Wed], [Thu], [Fri])
) unpvt;

结果:

+=======+========+=========+
|  item |  price | weekday |
+=======+========+=========+
| Item1 |    116 |     Mon |
+-------+--------+---------+
| Item1 |    112 |     Tue |
+-------+--------+---------+
| Item1 |    117 |     Wed |
+-------+--------+---------+
| Item1 |    109 |     Thu |
+-------+--------+---------+
| Item1 |    120 |     Fri |
+-------+--------+---------+
| Item2 |    227 |     Mon |
+-------+--------+---------+
| Item2 |    233 |     Tue |
+-------+--------+---------+
| Item2 |    230 |     Wed |
+-------+--------+---------+
| Item2 |    228 |     Thu |
+-------+--------+---------+
| Item2 |    210 |     Fri |
+-------+--------+---------+
| Item3 |    145 |     Mon |
+-------+--------+---------+
| Item3 |    158 |     Tue |
+-------+--------+---------+
| Item3 |    152 |     Wed |
+-------+--------+---------+
| Item3 |    145 |     Thu |
+-------+--------+---------+
| Item3 |    125 |     Fri |
+-------+--------+---------+
           

 类似资料:
  • 主要内容:语法Transact SQL 中的 Pivot 和 Unpivot 是关系运算符。可以用于将一张表转换成另一张表,以实现对桌子的清晰视图。 Pivot 运算符将行数据转换为列数据。 Unpivot 关系运算符的工作方式与 Pivot 运算符相反。它将基于列的数据转换为基于行的数据,将基于行的数据转换为基于列的数据。 语法 1. Pivot: 2. UnPivot: 示例1 在这里,我们创建的表名为“t

  • 问题内容: 枢轴,伙计…我只是想念它。也许是因为我没有做汇总。哎呀,也许枢轴不是做到这一点的方法。感觉应该很简单,但这让我感到困惑。 假设我有这个: 我怎样才能将这两个记录取回: 就此问题而言,需要注意的几点 我 从来没有 打算要回两个以上的记录 我总是会取回整数,但 我不知道它们会是什么 。 问题答案: 您可以实现运算符: 参见带有演示的SQL Fiddle

  • 问题内容: 有人可以通过板载触发器帮助解决简单的t- sql脚本问题吗?我使用非常简单的触发器将数据从一个表复制到另一个表(这些表之间没有关系)。当我尝试在触发器创建之后(从同一脚本)直接在第一时间插入数据时,我得到了期望的结果,但是所有下一次尝试都在下一个提示下失败了:’ ‘我很困惑,这意味着什么。查看下面的触发器: 没有理由发布表格的图表,因为它非常原始(正如我在上面提到的那样,这些表格之间没

  • 问题内容: 我目前的布局为: 并且我想“取消透视”数据,使其看起来像: 使用pandas / NumPy完成此操作的最佳方法是什么? 问题答案: 您只需要做,这将创建一个以月为第一级,以年为第二级索引的MultiIndexed Series。如果您希望它们成为列,则在此之后调用。

  • 问题内容: package main 该代码可以很好地工作。但是,如果按如下所示更改方法,则会导致死循环。区别在于将替换为。为什么? 问题答案: 因为程序包检查要打印的值是否具有方法(或换句话说:是否实现接口),如果是,则将调用它以获取值的表示形式。 软件包doc中对此进行了说明: […]如果操作数实现String()字符串方法,则将调用该方法将对象转换为字符串,然后根据动词的要求对其进行格式化(

  • 问题内容: 如何编写一个查询,该查询会将始终具有1行和许多列的表取消透视表到具有2列的结果集中:column_name和value。我知道表格的底层结构是真正的问题所在,但是我无法改变这一点。该查询还必须不了解所述表中的列的名称和/或数量,因为经常添加列(同样,我知道,不良的设计,无法更改它),我也不想每次添加新列时都必须更新查询。我已经能够使用unpivot完成一些操作,但是该查询要求对列名进行