資料庫中的行列轉換
問題描述
在評教系統中查詢教師成績處涉及到了資料的行轉列應用,首先介紹下行轉列要解決的問題:
我們資料庫中儲存的資料結構類似為:
而最後我們要達到的查詢效果為:
我們將課程列分成了三列,而對應的分數列的資料作為記錄插入到了相應課程的後面。
功能來源
為什麼會出現這樣的需求呢?
資料庫設計的過程中為了滿足使用者的動態要求(新增欄位),可以採用定義欄位名錶,定義一個欄位值的表,以達到用靜態表達動態。也就是說以資料庫表縱向的增加替代原有的橫向延伸,即記錄條數的增加替代欄位增加。
這樣的設計帶來了靈活,但同時帶來了統計分析的麻煩,因為統計分析時有可能需要顯示欄位展開的情況。如評教系統中的具體實現:
由於考核專案會進行動態的新增刪除,因此設定的考核專案表,儲存對教師的考核專案
而儲存教師評教分數的表需要獲取考核專案資料,儲存圖示為:
最終需要的顯示效果是要將考核專案列為標題,而分值作為記錄新增到對應的考核專案下。
此處我們我們通過將動態變化的考核專案作為新的表的記錄來儲存帶來了設計的靈活性,而顯示的時候卻要進行行列的轉換才能得到想要的結果。
具體實現
查詢相關資料進行實現,明白了行轉列又分成了靜態和動態之分,靜態的是不需要擴充套件的,很容易實現,而針對評教系統中的功能則是對應的動態實現。
針對第一個例項
1.通過執行字串的拼接實現動態行轉列
--變數按sql語言順序賦值 declare @sql varchar(500) set @sql = 'select 姓名' select @sql = @sql+',max(case 課程 when '''+ 課程 +''' then 分數 else 0 end)['+課程+']' from(select distinct 課程 from tb)a --同from tb group by課程,預設按課程名排序 set @sql= @sql + ' from tb group by 姓名' exec(@sql)
2.使用isnull、pivot函式
declare @sql varchar(8000)
--獲得課程集合
select @sql=isnull(@sql+',','')+ 課程 from tb group by 課程
set @sql='select * from tb pivot (max(分數) for 課程 in ('[email protected]+')) a'
exec(@sql)
3.新增算總分、平均分的要求
declare @sql varchar(8000)
select @sql=isnull(@sql+',','')+ 課程 from tb group by 課程
set @sql='select m.* , n.總分,n.平均分 from
(select * from (select * from tb) a pivot (max(分數) for 課程 in ('+
@sql+')) b) m ,
(select 姓名,sum(分數)總分, cast(avg(分數*1.0) as decimal(18,2)) 平均分 from tb group by 姓名) n
where m.姓名= n.姓名'
exec(@sql)
新得小結
雖然評教系統中已經實現了對行列資料的轉換,但想要使用另外一種方法進行實現。進行了對行轉列功能的搜尋實現之後,在轉接到評教系統上的應用上來還是碰到了很多問題,到現在仍沒有完全解決,只得暫時先放一放了。對資料庫的靈活設計也有了一定的體會,在考慮靈活性的同時也要考慮使用者的體驗度的。對行列互相轉換的還是需要更多的思考呀。
相關推薦
資料庫操作--行列轉換
在資料庫操作的時候會碰到行列轉換,最經典的屬於姓名-學科-成績表了。 表 student 姓名 (name) 學科(subject) 成績 (grade) 張三 語文
MySQL中行列轉換的SQL技巧 • cenalulu's Tech Blog
詳細介紹MySQL中用SQL實現行列轉換的技巧 行列轉換常見場景 由於很多業務表因為歷史原因或者效能原因,都使用了違反第一正規化的設計模式。即同一個列中儲存了多個屬性值(具體結構見下表)。 這種模式下,應用常常需要將這個列依據分隔符進行分割,並得到列轉行的結果。 表資料:
pandas中行列轉換
In [31]: import pandas as pd ...: import numpy as np ...: df = pd.DataFrame(np.arange(8).reshape(2,4),index=['AA','BB'],columns= ...: [['two','
SQL Server中行列轉換 Pivot UnPivot
PIVOT用於將列值旋轉為列名(即行轉列),在SQL Server 2000可以用聚合函式配合CASE語句實現 PIVOT的一般語法是:PIVOT(聚合函式(列) FOR 列 in (…) )AS P 完整語法: table_source PIVOT( 聚合函式(value_column) FOR piv
ORACLE中行列轉換的問題解決
在論壇上看到一個問題,自己以前也遇到過,像是一個老友,又熟悉又陌生,內心愧疚,趕緊去實際驗證,然後記錄在這裡給自己提個醒。首先建立兩張表A,B,並插入資料,create table A (ID number(4),NAME varchar2(10));comment on c
SQL Server 2005 中行列轉換(Pivot 和 UNPivot的使用)
針對sql2005 系統提供兩個新的關鍵字 PIVOT 和UNPIVOT可用來作此類操作.語法規則<pivot_clause> ::= ( aggregate_function ( value_column ) FOR pivot_
資料庫中的行列轉換
問題描述 在評教系統中查詢教師成績處涉及到了資料的行轉列應用,首先介紹下行轉列要解決的問題: 我們資料庫中儲存的資料結構類似為: 而最後我們要達到的查詢效果為:
資料庫中的行列轉換(橫豎轉換)
(豎的資料表變橫的資料表)例子: --建立tb_course表,並插入測試資料 CREATE TABLE tb_course( NAME VARCHAR(20), ##姓名 course VARCHAR(20), ##課程 grade INT ##成績 ); --測試資料
SQL中PIVOT 行列轉換
tor 子句 輸入 ble ont 運算符 之間 忽略 sql語句 本文導讀:T-SQL語句中,Pivot運算符用於在列和行之間對數據進行旋轉或透視轉換,PIVOT命令可以實現數據表的列轉行,同時執行聚合運算,UNPIVOT則與其相反,實現數據的行轉列。 PIVOT通過將
資料庫中樹結構資料,轉換為Java物件樹結構( 多叉樹結構 )
總體就是圖所表示所表示的轉換,由資料庫 => Java物件轉換,程式碼比較簡單 提供了兩個查詢方法: No.1 : Map<String,List<Tree>> arrMap = queryGroupToMap();//
資料庫中的DATE型別在頁面以同樣的格式顯示(在Service層進行轉換)
一. 實體類 實體類的設計:注意這裡的包必須匯入java.sql.Date,同時增加了一個String dateString屬性為後面進行日期轉換做準備 二. 資料庫 資料庫欄位設計:其中creation_date設計的是date型別 3. 前端頁面
將資料庫的資料轉換為excel檔案下載到本地的方法中遇到的困難及解決方案
以下是將資料庫的資料轉換為excel檔案下載到本地的方法 @Autowired private BooksService booksService; @RequestMapping("/downloadBooksExcel") public void down
JSON將資料庫中的date欄位轉換成時間戳
問題描述:資料庫中的date欄位:2018-09-01 12:23:23,在Java中取出該欄位,並用FastJSON將其轉化,你就會發現時間變成了148364681324這樣的時間戳,FastJSON提供瞭解決方法。 解決方法:在對應的實體類的的屬性上方定義一
Springboot整合Mybatis使用TypeHandler來轉換資料庫中的資料
TypeHandler轉換指定資料庫中資料為Enum列舉 在一些時候,我們的資料庫需要存放一些例如狀態資訊的資料,通常的我們使用int整型來儲存,例如(0:失敗,1:成功)等,用這樣的資料是可以的,但對於前端的程式設計是不友好的,所以我們可以使用TypeHandler來進行一個轉換,將其轉化成一個列舉型
[資料庫] SQL查詢語句錶行列轉換及一行資料轉換成兩列
本文主要講述了SQL查詢語句表之間的行列轉換,同時也包括如何將一行資料轉換成兩列資料的方法、子查詢的應用、decode函式的用法。希望文章對你有所幫助~ 1.建立資料庫表及插入資料2.子查詢統計不同性質的學生總數3.一行資料轉換成兩列資料 union all4.錶行列資料轉
MySql和Oracle中的行列轉換筆記
建表先: DROP TABLE IF EXISTS `temp`; CREATE TABLE `temp` ( `year` varchar(10) DEFAULT NULL, `month` varchar(10) DEFAULT NULL, `amount` float(6,2)
如何將資料庫中的時間戳資料取出來後轉換為年月日時分秒
sql語句中使用FROM_UNIXTIME()方法,如下: select FROM_UNIXTIME(xxxxxTime/1000) from tableName where xxxx 下劃線部分為可替換內容。 打完收工,第一篇完成。就是感覺格式太醜!!!
MySql資料庫中long型資料與日期相互轉換
mysql是我們用的最多的資料庫之一,我們呢平時為了方便查詢,通常會選擇將時間儲存為毫秒或者秒的形式。但是這樣很不直觀,今天就看看mysql怎樣做到long型資料與日期相互轉換。 1. 秒數與Date之間的轉換:select from_unixtime(1388776825); 還可以定義
資料庫中10位或13位時間戳轉換為標準時間
最近專案要讀取一個數據庫,其中的一個時間戳為10位,一個為13位。 1.10位時間戳轉換: 其中10位時間戳準換為標準時間很簡單: 簡單起見,這裡資料庫只有一張表(test)一個欄位(createTime)和一條記錄(1415845484): createTime:1415
Mongodb 學習筆記 (7)通過純mongo語句,將資料庫中的秒級時間戳,轉換成Date型別,並且裝換成任意時間格式
背景:在公司專案中,我們使用了秒級時間戳,作為時間資訊。但是mongodb自支援的多種時間處理函式,只針對date型別的欄位,於是我嘗試使用了mongo語句,將整型數的時間戳,通過mongo語句,轉換成date型別。 這裡使用的是aggregate(聚合),如下: db.t_merchant