在工作中,我常常撰寫一些技術報告,以總結當前測試進度、分析測試結果。這些技術報告需要圖表來展示數據,而這些數據大多存放在數據庫中。經過嘗試,我學習並總結出一種利用Excel展示SQL Server數據的方法。雖然是雕蟲小技,卻勝在快捷方便。本文將介紹該方法的基本技術:利用Excel導入SQL Server中的數據。
在本文中,我使用的是Excel 2007,連接的數據庫是SQL Server 2008 Express。幸運的是,所介紹的技術同樣適用於Excel 2010和SQL Server的其他版本。不過,本文使用的T-SQL腳本使用了一些SQL Sever 2008才支持的語法,需要修改之后才能用於SQL Server 2005。
1. 數據初始化
出於演示的目的,我在本機的SQL Server上創建了數據庫bug_db。在該數據庫中,我創建了表Bug和BugType,並填充了數據。完整的SQL腳本可以從這里下載。
-- create tables CREATE TABLE dbo.Bug ( ID INT IDENTITY, BugTypeID TINYINT NOT NULL, CreatedTime DATETIME NOT NULL ) ON [Primary] GO CREATE TABLE dbo.BugType ( ID TINYINT, TypeName NVARCHAR(16) ) ON [Primary] GO INSERT INTO dbo.BugType (ID, TypeName) VALUES (1, 'code defect'), (2, 'design'), (3, 'performance'), (4, 'configuration'), (5, 'document') GO -- insert bug data INSERT INTO dbo.Bug (BugTypeID, CreatedTime) VALUES (2, '3/1/2010 12:00:00 AM'), (3, '3/1/2010 12:00:00 AM'), …
Bug表記錄了測試團隊發現的Bug信息,包含唯一的標識符(ID)、Bug的類型信息(BugTypeID)和發現時間(CreatedTime)。為了簡化演示,Bug表沒有包含本文不需要的信息(它們在真實數據庫中很重要),如標題(Title)、優先級(Priority)、嚴重性(Severity)等。此外,BugType表記錄了BugTypeID對應的Bug類型名。
2. 創建視圖以完成計算
假設我的任務是分析Bug類型的分布情況,那么我可以在數據庫中創建如下視圖。
CREATE SCHEMA [test] AUTHORIZATION [db_owner]
GO
CREATE VIEW test.Stat AS
WITH T AS
(
SELECT
TypeName,
COUNT(*) AS Cnt
FROM dbo.Bug B
INNER JOIN dbo.BugType T
ON B.BugTypeID = T.ID
GROUP BY T.TypeName
)
SELECT
TypeName,
Cnt,
1.*Cnt/Total AS Rate
FROM T
CROSS JOIN (SELECT COUNT(*) AS Total FROM dbo.Bug) B
GO
為了避免名字沖突,我首先創建了新的數據庫架構(schema)test。在test架構中,創建了視圖Stat。該視圖利用SQL 2005引入的公共表達式計算出每一種Bug的個數,隨后除以Bug總數以獲得Bug類型的分布。運行SELECT * FROM test.Stat,可獲得以下結果。
3. 連接視圖以展示數據
在Excel 2007中,點擊Data → From Other Sources → From SQL Server,打開數據連接向導。
在登錄對話框中,輸入待連接的數據庫。
然后,選擇數據庫bug_db中的Stat視圖。
然后,點擊Finish以完成向導。這時,Excel會詢問將導入的數據放置於何處。選擇一個合適的單元格之后,點擊OK。
這樣視圖Stat中的數據就呈現在Excel數據薄的表格中。
此時,Rate列的小數部分過長,顯得不那么美觀。可以右擊列Rate所在列(即C列),選擇Format Cell,在彈出的對話框中選擇Percentage,然后點擊OK。
這樣,Rate列的數據被格式化為百分數。
這時,可以將該表拷貝復制到Word或Outlook郵件中,作為分析報告的一部分。不過,一圖勝過千言萬語。不妨利用Excel的作圖功能,繪制出一幅反映數據分布的圖,以輔助說明數據表。Excel的作圖功能非常強大,在此不再贅述,只是展示一副基於該表的柱狀圖。從該圖可以看出,大部分Bug屬於code defect、design和performance。以此可以推測被測試程序有較多的性能問題。
4. 數據更新
如果表格和圖需要反復使用,可以將數據薄保存。下次打開該數據薄,Excel會給出安全警告:數據連接被中斷。這時,需要點擊Options,並允許數據訪問。之后,Excel會重新導入數據,並更新基於導入數據的圖。數據庫中的數據變化可以自動地在數據薄中得到體現,實在是非常方便。
此外,如果需要手動更新數據,可以利用Data下的Refresh All。
5. 小結
上述數據展示方法,是分層模型的一個實例。
- SQL Server是數據層,存儲了待展示的數據。
- Excel是展示層,存儲了數據格式化方法和圖表。
- SQL Server的視圖充當了邏輯層,存儲了計算邏輯。實際上,Excel的數據連接支持SQL查詢,但是我傾向於將SQL查詢以視圖的形式置於數據庫之中。第一,在Excel中編寫查詢比較困難,在SQL Server Management Studio中編寫查詢非常便捷。第二,置於SQL Server的計算邏輯可以被多個Excel數據薄共享。
分層模型充分發揮了SQL Server在數據存儲和操縱上的強大功能,以及Excel在數據表現和圖表制作的靈活性。不使用傳統意義上的“編程語言”,便快速地實現了數據獲取與展示的自動化。
參考文獻
- 韓小良,Excel+SQL Server數據庫管理技術詳解
- John Walkenbach,Excel 2007寶典

![image3_thumb[1] image3_thumb[1]](/image/aHR0cHM6Ly9pbWFnZXMuY25ibG9ncy5jb20vY25ibG9nc19jb20vbGlhbmdzaGkvMjAxMjA0LzIwMTIwNDAzMDMwNDM1MjY2LnBuZw==.png)












