行列轉換對於工作還是學習中總是不可避免的會遇到(雖然本人還尚未工作,萌萌噠的學生一枚),解決的方法也有很多,我這裡就總結一下我所想解決的問題以及怎麼去解決的方法,

可能網上已經有很多類似的方法了,有的比我的可能會更好,就當我記錄一下自己的學習經歷吧。這裡我們列舉一個關於股票的每日入賬出賬做一個統計然後整理資料,雖然例子可能不太合理,

但是不要太執著於這些細節,能說明問題就好,傻笑ing。。。。。

1 列轉行:按照某一列分組,將另一列作為行時列名可數,不變。

什麼意思呢?話說多了反而不懂,放兩張圖以表敬意。

很簡單的做法,就是想統計一下一天的買入賣出情況,實現起來也很簡單,因為操作這一列就兩種行為,轉換起來也非常簡單,程式碼如下

SELECT 日期 ,
SUM(CASE 操作 WHEN '買入' THEN 交易額 ELSE 0 END ) 買入,
SUM(CASE 操作 WHEN '賣出' THEN 交易額 ELSE 0 END ) 賣出
FROM TabName
GROUP BY 日期

其實就是對case when then else的使用,也沒有什麼特別的技巧,非要說運用了什麼思想的話就是採用了兩次分組的思想吧。第一次分組是按日期分組,第二次則是按操作

來進行分組。如何你想將買入和賣出操作合併的話,就要利用一個函式,group_concat,從單詞的意思就可以看出來,就是組的拼接(英語太渣,不要介意),得到的效果如下

mysql程式碼如下:

select
日期, group_concat(日期,交易額) as 統計from TabName
group by Date

 

sqlserver程式碼如下:

select 日期,
CONCAT('買入:',SUM(CASE 操作 WHEN '買入' THEN 交易額 ELSE 0 END ) ,'賣出:',SUM(CASE 操作 WHEN '賣出' THEN 交易額 ELSE 0 END )) as 統計
from TabName
group by 日期

對此我只想說一句,微軟mmp,你就不能學一下騰訊,借鑑借鑑,傻笑ing!

2 同樣是列轉行,但是如果作為行的列並不可數,例如本例中的日期,那麼又應該怎麼做呢?

現實真殘酷,當時做到這一步真的不知道怎麼辦,因為日期並不知道有多少(並不能因為我這裡列出了三個就預設為三個,畢竟以後還不知道會有什麼資料,所以我們並不能寬泛的討論)

其實想想當時也真傻,不知道有多少個就統計一下唄,自己建立一個函式將所有的不同的日期統計下來不就好了。思路清晰了,接下來就開工。

首先建立一個臨時表,因為我每天的操作是重複的,所以我要先統計一下

select 操作,日期,sum(交易額) as 交易額
into #temp
from TabName
group by 操作,日期

接下來就是單純的將日期這一列變為行了,這裡我就採用pivot(關於pivot的介紹估計網上一大堆了,我就不敘述了,不理解的可以留言)

我的心好累,總算有結果了,接下來放程式碼

我只能說一句,不容易啊,首先用一個臨時表將所有的不重複的日期找出來然後放到@date中,再將每日重複的買入賣出做一個統計,最後再

利用pivot進行行和列的翻轉。這裡必須要要注意一點,pivot所識別的列名必須是帶有'[]'這倆中括號,所以我這裡採用了quotename函式來加括號,

然後再利用substring進行切割多餘的字母。

有啥更好的方法希望大佬們給點意見,如果方法重複了也希望不要噴我,互相學習吧,我只是菜鳥!