复杂sql分组查询 ( pivot)

      一个数据表里面字段有年、月、日、金额、支付方式等字段,然后现在想写个sql语句,把每一天的每种支付方式金额(支付方式有多重)排在同一行,

最后在增加一列小计当前的所有支付方式的金额。如下图:

原sql查询出来的结果是这样的:

-------------------------------------------------------------------------------------------

然后想实现的sql结果最后呈现是这样的:

这可为难了我了,简单的增删改查左右链接sql语句我还会写,这个稍微复杂一点我就不知道如何下手了。该怎么分组,然后把行增加为列呢?

去找度娘搜的时候,都不知道怎么描述自己的想搜的关键字。最后找了一位sql高手同学帮忙解决了这个问题,

人家只是一句简单的sql语句就把我的需求给实现了,实在是让我佩服!这个pivot关键是什么东东,我还第一次看见,从来没用过,这么强大!

sql语句:

SELECT Year,Months,tDays,[711], [BankIn],[iTunesHK] , [711]+[BankIn]+[iTunesHK] as total
FROM ( select * from #temp) AS t
PIVOT
(SUM(amount) FOR [PayType] IN ( [711], [BankIn],[iTunesHK])) AS t;

效果截图如下:

原文链接:http://www.cnblogs.com/tandaxia/p/4888623.html

补充:关于一个循环插入数据sql语句问题

需求:随机从一个表查出5条ID,然后插入到另外一个表中。

实现:刚开始使用游标,后面头说效率不好,影响性能,然后改成临时表插入结果集。之前没写过这种sql, 感觉效果很棒,记录一下:

  ---- 使用游标循环插入-------

IF OBJECT_ID('sp_AddRecord') IS NOT NULL 
    DROP proc sp_AddRecord
GO 
CREATE proc sp_AddRecord 
@ID int -- 传入的id参数
as 
BEGIN Tran
    
    --使用游标循环插入到记录表中tbl_Record
    declare @FromID int
    declare Temp_Cursor cursor for         --定义游标cursor1
    select top 5 ID from tbl_Member where ID<>@ID order by newid() -- 随机获取5个ID
    open Temp_Cursor                       --打开游标

    fetch next from Temp_Cursor into @FromID  --将游标向下移1行,获取的数据放入之前定义的变量@ToID中

    while @@fetch_status=0           --判断是否成功获取数据
    begin
        --进行相应处理(跟据需要填入SQL文)
        insert into tbl_Record (FromID, ToID, [Status], CreateDate) values(@FromID, @ID, 0, GETDATE())
        fetch next from Temp_Cursor into @FromID  --将游标向下移1行
    end

    close Temp_Cursor                   --关闭游标
    deallocate Temp_Cursor                --释放游标
    
    If @@ERROR <> 0 Goto Err
    
    Select 1 As ResultStatus
Commit Tran
Return 
Err:
    Select 0 As ResultStatus
    RollBack Tran
    Return
GO

---  使用临时表插入结果,实现同样的效果,效率更好 -----

IF OBJECT_ID('sp_AddRecord') IS NOT NULL 
    DROP proc sp_AddRecord
GO 
CREATE proc sp_AddRecord 
@ID int -- 传入的id参数
as 
BEGIN Tran
    
    select top 5 ID Into #DatingMember from tbl_Member where ID<>@ID order by newid() -- 随机获取5个ID
    
    insert into tbl_Record (FromID, ToID, [Status], CreateDate)
    Select ID,@ID As ToID,0, GETDATE() 
    From #DatingMember

    Drop Table #DatingMember --删除临时表
    
    If @@ERROR <> 0 Goto Err
    
    Select 1 As ResultStatus
Commit Tran
Return 
Err:
    Select 0 As ResultStatus
    RollBack Tran
    Return
GO

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

MySQL 清除表空间碎片

表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白 当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用...

39770
来自专栏WindCoder

网易MySQL微专业学习笔记(五)-SQL语言进阶

这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。

7410
来自专栏大数据架构

Spark SQL / Catalyst 内部原理 与 RBO

从上图可见,无论是直接使用 SQL 语句还是使用 DataFrame,都会经过如下步骤转换成 DAG 对 RDD 的操作

13120
来自专栏算法修养

Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考

前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移。因为项目整体要迁移到ASP.NET Core ...

669140
来自专栏涂小刚的专栏

Spark SQL 之 Join 实现

如今Spark SQL(Dataset/DataFrame)已经成为Spark应用程序开发的主流,作为开发者,我们有必要了解Join在Spark中是如何组织运行...

3.9K20
来自专栏转载gongluck的CSDN博客

ADO大总结

内容比较乱,作为草稿,对现有的ado数据库操作函数方法进行汇总。 小函数 m_pRecordset->RecordCount//取得记录数量 全局变量 #i...

31480
来自专栏JavaQ

三分钟学习分布式ID方案

在分布式系统中,当数据库数据量达到一定量级的时候,需要进行数据拆分、分库分表操作,传统使用方式的数据库自有的自增特性产生的主键ID已不能满足拆分的需求,它只能保...

14120
来自专栏me的随笔

Dapper简明教程

Dapper是一款轻量级的ORM框架,有关Dapper优缺点的文章网上一大堆,这里小编就不再赘述啦。下面直接进入正题:

22250
来自专栏张善友的专栏

SQL SERVER 2008 Hierarchyid数据类型

以往我们在关系数据库中建立树状结构的时候,通常使用ID+ParentID来实现两条纪录间的父子关系。但这种方式只能标示其相对位置。解决这类问题在SqlServe...

259100
来自专栏Java帮帮-微信公众号-技术文章全总结

JavaWeb05- 就这几步轻松操作MySQL数据库!

mysql-1 一.数据库 1. 数据库介绍 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过sql语句对数据库中...

28350

扫码关注云+社区

领取腾讯云代金券