復雜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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM