一個數據表里面字段有年、月、日、金額、支付方式等字段,然后現在想寫個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