做者: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