簡單的敘述下SQL中行列轉換的小知識!

2022-07-16 07:09:08 字數 1995 閱讀 4493

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

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

但是不要太執著於這些細節,能說明問題就好,傻笑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 日期

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

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

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

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

select 操作,日期,sum(交易額) as 交易額

into #temp

from tabname

group by 操作,日期

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

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

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

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

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

sql 實現表的行列轉換

create proc editorwork accountbytopicname1 編輯工作按文章內容型別統計各欄目的文章數 starttime varchar 50 查詢開始時間 endtime varchar 50 查詢結束時間 asdeclare sql varchar 8000 set s...

sql 語句寫的行列轉換

以前面試老遇到乙個行列轉換的問題,今天沒事,順便記錄一下 假設有這樣一張表,如下圖,建立表就不說了,直接建或者sql語句都行 sql語句如下 第一種 select name as 姓名,max case subject when 語文 then result else 0 end as 語文,max...

簡單敘述一下MYSQL的優化

show processlist 後可以發現所有的 長連線的查詢 狀態為sleep,並占用系統資源 而使用者每訪問一次,mysql程序數就不段地增加,直至資源耗盡 當然使用長連線程式執行完後要關閉連線,但畢竟有可能出現執行中段的現象,於是便造成mysql程序堆積。然而即使每次都有關閉連線,但在查詢併...