複雜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
相關文章
相關標籤/搜索