复杂sql分组查询 ( pivot)

做者:TDXhtml

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

最后在增长一列小计当前的全部支付方式的金额。以下图:性能

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

-------------------------------------------------------------------------------------------spa

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

 

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

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

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

sql语句:it

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
相关文章
相关标签/搜索