zoukankan      html  css  js  c++  java
  • 复杂sql分组查询 ( pivot)

    作者:TDX

    一个数据表里面字段有年、月、日、金额、支付方式等字段,然后现在想写个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
  • 相关阅读:
    《python核心编程第二版》第8章习题
    《python核心编程第二版》第7章习题
    虚拟Ip技术如何实现备机容灾
    LeetCode算法编程连载之五
    GIT使用入门篇(管理自已的代码)
    LeetCode算法编程之连载四(二分法)
    LeetCode算法编程之连载三
    LeetCode算法编程之连载二
    LeetCode算法编程之连载一
    Python 使用flush函数将缓冲区数据立即写磁盘
  • 原文地址:https://www.cnblogs.com/lxl57610/p/7446159.html
Copyright © 2011-2022 走看看