热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用枢轴转换表:将行选择为列

我的数据需要按以下方式转移:

我的数据需要按以下方式转移:

使用枢轴转换表:将行选择为列

我一直在努力使用存储过程方法,使用临时表将SKU分组,然后构建输出,但是速度非常慢。现在,我刚刚找到了PIVOT关键字。如果有人可以向我展示如何使用PIVOT进行转换,我将不胜感激。

请注意,奋斗之处在于FeeName列,因为它的值成为结果中新的三列(目前)。

创建表格:

USE [Test];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE TABLE [dbo].[Order]
(
[Id] [UNIQUEIDENTIFIER] NOT NULL,[OrderId] [INT] NOT NULL,[FeeName] [VARCHAR](25) NOT NULL,[Amount] [MONEY] NOT NULL,[SKU] [INT] NOT NULL,[Description] [VARCHAR](100) NOT NULL,CONSTRAINT [PK_Order_Id]
PRIMARY KEY CLUSTERED ([Id] ASC)
WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON,OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF
) ON [PRIMARY]
) ON [PRIMARY];
GO
INSERT [dbo].[Order] ([Id],[OrderId],[FeeName],[Amount],[SKU],[Description]) VALUES (N'ce62e8a8-6650-4466-b629-086cc5b5db79',12346,N'Item Fee',100.0000,789,N'Third')
GO
INSERT [dbo].[Order] ([Id],[Description]) VALUES (N'3229c09d-9562-4497-811e-0e0c2da022bc',12347,123,N'First')
GO
INSERT [dbo].[Order] ([Id],[Description]) VALUES (N'dc97d7c3-f31b-422e-be50-1197d67becdd',12345,N'Commission',125.0000,[Description]) VALUES (N'c8951c07-1070-4962-b4e4-1890d8cbc767',N'Penalty',150.0000,[Description]) VALUES (N'4faf4cf1-18ef-4fbe-bb13-19345575d981',[Description]) VALUES (N'03ae5fc7-8df2-4ea1-9186-1dc710d21d96',456,N'Second')
GO
INSERT [dbo].[Order] ([Id],[Description]) VALUES (N'a19a57ed-f56c-443b-8694-2c262bf40fb0',[Description]) VALUES (N'5cac38cd-6e49-4d50-b644-2e42cff6faa3',[Description]) VALUES (N'f5909f7c-54da-49aa-a0e9-4123a404a8ff',[Description]) VALUES (N'1b821e19-781c-4ca3-ba7d-41e8a0ef10c2',[Description]) VALUES (N'f005fdc1-04e5-4bdc-9b89-433589ed8e39',[Description]) VALUES (N'77800636-35bd-4528-8171-4ae44c9edf14',[Description]) VALUES (N'120a6dd8-75a5-4c03-a319-511a137ea2f1',[Description]) VALUES (N'589d0383-f2f7-475c-b84f-56dda1561a8f',[Description]) VALUES (N'3322b7a2-8173-470b-a92b-5b9edbddcd69',790,N'Fourth')
GO
INSERT [dbo].[Order] ([Id],[Description]) VALUES (N'4aeb5d9e-0e8a-4111-a81d-65cccba9cd28',[Description]) VALUES (N'fbc02e3c-db5a-4e1a-bf28-6878ca244fc4',[Description]) VALUES (N'9050d591-5ddd-44a8-a752-69a3ee0e3a87',[Description]) VALUES (N'239ebb6c-adb9-4946-a9a1-760f5cf6ec00',[Description]) VALUES (N'0ef5aa3f-f300-4498-b883-775187a2fc67',[Description]) VALUES (N'9e4dcf8e-e49d-429e-8d05-a315567e9562',[Description]) VALUES (N'fa82700d-6dc8-4765-921a-ad38bb2e7f3b',[Description]) VALUES (N'84a9cfac-0c10-4c33-b04b-b66b3c4f53a2',[Description]) VALUES (N'b6e8ded6-43ee-4e67-8c53-b7da2a8f2141',[Description]) VALUES (N'95867794-1fbb-455e-ab94-d37fcda499af',[Description]) VALUES (N'64f3ecc6-0a43-4204-b5b0-dd1dd21e1eb2',[Description]) VALUES (N'647f63c3-d2ba-4fc1-9169-e5525db9d4d9',[Description]) VALUES (N'd4115a4e-a149-4a0b-89a6-f4cfdaf8f57f',[Description]) VALUES (N'd93a6e0f-f6ce-4d29-8894-fb0d858d4095',[Description]) VALUES (N'12e3df48-f63f-4e1e-b87e-fc4da7c30eac',N'First')
GO
ALTER TABLE [dbo].[Order] ADD CONSTRAINT [DF_Order_Id] DEFAULT (newid()) FOR [Id]
GO
ALTER TABLE [dbo].[Order] ADD CONSTRAINT [DF_Order_Amount] DEFAULT ((0)) FOR [Amount]
GO


您的屏幕截图(“商品信用”)与示例数据(“商品费用”)之间存在差异,由于您在以下位置重复使用了相同的Amount,因此很难看到结果结束,但是我想这就是您想要的:

select OrderId,[Item Fee],[Commission],[Penalty],SKU,Description
from
(
select OrderId,FeeName,Amount,Description from [Order]
) as src
pivot
(
max(Amount)
for FeeName in ([Item Fee],[Penalty])
) piv;

,

我建议为此使用条件聚合。与pivot的特定于供应商的实现不同,这是一种适用于大多数(如果不是全部)RDBMS的标准技术。而且,它通常比特定的实现(通常依赖于幕后的条件聚合)更快甚至更快。

select
OrderID,max(case when FeeName = 'Item' Credit' then Amount end) [Item Credit],max(case when FeeName = 'Commission' then Amount end) [Commission],max(case when FeeName = 'Penalty' then Amount end) [Penalty],Description
from [Order]
group by
OrderID,Description
order by
OrderID,Description

Demo on DB Fiddle with your sample data

OrderID | Item Fee | Commission | Penalty | SKU | Description
------: | :------- | :--------- | :------- | --: | :----------
12345 | 100.0000 | 125.0000 | 150.0000 | 123 | First
12345 | 100.0000 | 125.0000 | 150.0000 | 456 | Second
12345 | 100.0000 | 125.0000 | 150.0000 | 789 | Third
12345 | 100.0000 | 125.0000 | 150.0000 | 790 | Fourth
12346 | 100.0000 | 125.0000 | 150.0000 | 123 | First
12346 | 100.0000 | 125.0000 | 150.0000 | 456 | Second
12346 | 100.0000 | 125.0000 | 150.0000 | 789 | Third
12347 | 100.0000 | 125.0000 | 150.0000 | 123 | First
12347 | 100.0000 | 125.0000 | 150.0000 | 456 | Second
12347 | 100.0000 | 125.0000 | 150.0000 | 789 | Third

推荐阅读
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
author-avatar
无限制空间689
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有