- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SQL基础教程之行转列Pivot函数由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
未来的一个月时间中,会总结一系列SQL知识点,一次只总结一个知识点,尽量说明白,下面来说说SQL 中常用Pivot 函数(这里是用的数据库是SQLSERVER,与其他数据库是类似的,大家放心看就好) 。
让我们先从一个虚构的场景中来着手吧 。
万国来朝,很多供应商每天都汇报各自的收入情况。先来创建一个DailyIncome 表 。
1
2
3
4
5
|
create
table
DailyIncome(VendorId nvarchar(10), IncomeDay nvarchar(10), IncomeAmount
int
)
--VendorId 供应商ID,
--IncomeDay 收入时间
--IncomeAmount 收入金额
|
紧接着来插入数据看看 。
(留意看下,有的供应商某天中会有多次收入,应该是分批进账的) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
insert
into
DailyIncome
values
(
'SPIKE'
,
'FRI'
, 100)
insert
into
DailyIncome
values
(
'SPIKE'
,
'MON'
, 300)
insert
into
DailyIncome
values
(
'FREDS'
,
'SUN'
, 400)
insert
into
DailyIncome
values
(
'SPIKE'
,
'WED'
, 500)
insert
into
DailyIncome
values
(
'SPIKE'
,
'TUE'
, 200)
insert
into
DailyIncome
values
(
'JOHNS'
,
'WED'
, 900)
insert
into
DailyIncome
values
(
'SPIKE'
,
'FRI'
, 100)
insert
into
DailyIncome
values
(
'JOHNS'
,
'MON'
, 300)
insert
into
DailyIncome
values
(
'SPIKE'
,
'SUN'
, 400)
insert
into
DailyIncome
values
(
'JOHNS'
,
'FRI'
, 300)
insert
into
DailyIncome
values
(
'FREDS'
,
'TUE'
, 500)
insert
into
DailyIncome
values
(
'FREDS'
,
'TUE'
, 200)
insert
into
DailyIncome
values
(
'SPIKE'
,
'MON'
, 900)
insert
into
DailyIncome
values
(
'FREDS'
,
'FRI'
, 900)
insert
into
DailyIncome
values
(
'FREDS'
,
'MON'
, 500)
insert
into
DailyIncome
values
(
'JOHNS'
,
'SUN'
, 600)
insert
into
DailyIncome
values
(
'SPIKE'
,
'FRI'
, 300)
insert
into
DailyIncome
values
(
'SPIKE'
,
'WED'
, 500)
insert
into
DailyIncome
values
(
'SPIKE'
,
'FRI'
, 300)
insert
into
DailyIncome
values
(
'JOHNS'
,
'THU'
, 800)
insert
into
DailyIncome
values
(
'JOHNS'
,
'SAT'
, 800)
insert
into
DailyIncome
values
(
'SPIKE'
,
'TUE'
, 100)
insert
into
DailyIncome
values
(
'SPIKE'
,
'THU'
, 300)
insert
into
DailyIncome
values
(
'FREDS'
,
'WED'
, 500)
insert
into
DailyIncome
values
(
'SPIKE'
,
'SAT'
, 100)
insert
into
DailyIncome
values
(
'FREDS'
,
'SAT'
, 500)
insert
into
DailyIncome
values
(
'FREDS'
,
'THU'
, 800)
insert
into
DailyIncome
values
(
'JOHNS'
,
'TUE'
, 600)
|
让我们先来看看前十行数据:
1
|
select
top
10 *
from
DailyIncome
|
如图所示:
DailyIncome 。
虽然数据是能够完全给展示了,但好像一眼望去不能得到对我们用处更大的信息,比如说我们想得到每个供应商的每天的总收入,这时我们应该做一些数据形式的转变了,平常的所用的是这样的.
1
2
3
4
5
6
7
8
9
|
select
VendorId ,
sum
(
case
when
IncomeDay=
'MoN'
then
IncomeAmount
else
0
end
) MON,
sum
(
case
when
IncomeDay=
'TUE'
then
IncomeAmount
else
0
end
) TUE,
sum
(
case
when
IncomeDay=
'WED'
then
IncomeAmount
else
0
end
) WED,
sum
(
case
when
IncomeDay=
'THU'
then
IncomeAmount
else
0
end
) THU,
sum
(
case
when
IncomeDay=
'FRI'
then
IncomeAmount
else
0
end
) FRI,
sum
(
case
when
IncomeDay=
'SAT'
then
IncomeAmount
else
0
end
) SAT,
sum
(
case
when
IncomeDay=
'SUN'
then
IncomeAmount
else
0
end
) SUN
from
DailyIncome
group
by
VendorId
|
得到如下的结果:
case when结果 。
如果大家仔细看结果的话,会有这样的发现,这是把VendorID进行了分组,并且对于每组中IncomeDay这一列中的值都变成了新的列名字,然后对IncomeAmount进行求和操作.
这样写可能是有些麻烦,别着急,我们用Pivot函数进行行转列试下.
1
2
3
4
5
6
|
select
*
from
DailyIncome
----第一步
pivot
(
sum
(IncomeAmount)
----第三步
for
IncomeDay
in
([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN])
---第二步
)
as
AvgIncomePerDay
|
来解释下,要想用好Pivot函数,应该理解代码注释中的这几步.
第一步:肯定是要明白数据源了,这里是DailyIncome 。
第二步:要明白要想让哪一列的值做新的列名字 。
第三步:要明白对于这新的列要求那些值呢?
下面有个练习题目,做之前不要看答案啊 。
问:对于SPIKE这家供应商来说,每天最大的入账金额.
1
2
3
|
select
*
from
DailyIncome
pivot (
max
(IncomeAmount)
for
IncomeDay
in
([MON],[TUE],[WED],[THU],[FRI],[SAT],[SUN]))
as
MaxIncomePerDay
where
VendorId
in
(
'SPIKE'
)
|
参考链接如下:
1.Pivot tables in SQL Server. A simple sample 。
2.行转列:SQL SERVER PIVOT与用法解释 。
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我的支持.
原文链接:https://www.jianshu.com/p/8f929264995e 。
最后此篇关于SQL基础教程之行转列Pivot函数的文章就讲到这里了,如果你想了解更多关于SQL基础教程之行转列Pivot函数的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 todolist 应用程序,它在 Pivot 控件内的单独 PivotItems 中具有多个 ListBox 控件。如果我导航到另一个页面,然后使用后退按钮返回,则显示的 Pivot 没有响
我想 pivot_long() 下面数据集的多列避免硬编码。我看过一些类似的问题,但我仍然做不到。 宽数据: > head(data) ID IND_TEST_SCORE ARG_G1_A
假设我有一个 orders 表,它将与另外三个名为 typings、translates 和 论文 。我知道数据透视表应该有点像 many to many polymorphic relation但这
当我尝试将 null 替换为 zero 时,收到以下错误消息。 The column name "jan" specified in the PIVOT operator conflicts with
有没有办法在数据透视表中为计算为零的单元格隐藏或显示空白单元格? 最佳答案 使用数字格式隐藏所选单元格中的零值: 按照此过程隐藏所选单元格中的零值。如果其中一个单元格中的值更改为非零值,则该值的格式将
我正在尝试理解 Select algorithm我遇到了 a good pivot VS a bad pivot 。我可以看到该算法正在使用 Partition 算法来分隔右侧的较大元素pivot 和
我有以下代码:
我有一个国家表和一个数据透视表 Country_language,其中列出了所有国家及其可用语言的翻译。 表结构如下: Languages -------------- ID Locale Recor
目前,PWS 上唯一的 RabbitMQ 服务看起来有点不确定。我想知道我是否可以使用 Pivotals 解决方案 https://network.pivotal.io/products/p-redi
我是使用 Spark 数据帧的新手。我正在尝试将 pivot 方法与 Spark(Spark 版本 2.x)一起使用并遇到以下错误: Py4JError: An error occurred whil
我需要转置一个表,其中 column1 是实体的名称,column2 到 column366 是一年中包含美元金额的日期。表,select语句,输出结果都给了 以下 - 问题 - 此语法要求我创建一个
我想知道是否可以像在 python 和 R 上那样在 OpenRefine 上创建值的聚合和汇总?示例: 包含 30 万条记录的医疗预约表身份识别患者 |年龄 |身份证预约 |值 患者汇总和总结的结果
我想知道是否可以像在 python 和 R 上那样在 OpenRefine 上创建值的聚合和汇总?示例: 包含 30 万条记录的医疗预约表身份识别患者 |年龄 |身份证预约 |值 患者汇总和总结的结果
我不熟悉 SQL 并使用 Google BigQuery。我有一个表,其中有一条记录如下所示: publication_number |受让人 US-6044964-A|索尼公司 |数字音频光盘公司
在尝试转换 sql 表时,我看到了这篇文章 Here .通过使用这种方法,我创建了一个查询。但是我现在已经意识到它当然会使用 MAX 函数聚合结果。但是,我需要 Colum 旋转,但要显示所有事件。从
我们能否将行旋转到多列,即 Create table #Temp_Trans ( P_ID int, Custom_Name varchar(30), Text_Value var
计算字段很棒,但有一些限制,例如无法对其进行排序(无法将字段移动到报告过滤器区域)。 我试过“强制”一个过滤器,就像微软的人建议的那样:https://answers.microsoft.com/en
我有以下数据集,我需要从中计算数据透视中不同值的计数。我尝试了几个函数,如 FREQUENCY、COUNTIFS 等,但我做不到。 输入 Input Data 输出 Expected Output 最
请看下面的数据: 我正在寻找生成以下输出的查询: 我正在试验“PIVOT”,但尚未取得预期的结果。 最佳答案 这应该有效: SELECT ReviewType, DER, LEI, NOR, [NOT
我有两个表Person(person_id, name) 和另一个表Contacts(person_id, phone_type, phone_no)。 Person-----------------
我是一名优秀的程序员,十分优秀!