用Excel展示SQL Server中的數據 (I): 數據庫連接


在工作中,我常常撰寫一些技術報告,以總結當前測試進度、分析測試結果。這些技術報告需要圖表來展示數據,而這些數據大多存放在數據庫中。經過嘗試,我學習並總結出一種利用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腳本可以從這里下載。

image3_thumb[1]

-- 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,可獲得以下結果。

image63

3. 連接視圖以展示數據

在Excel 2007中,點擊Data → From Other Sources → From SQL Server,打開數據連接向導。

image26

在登錄對話框中,輸入待連接的數據庫。

image25

然后,選擇數據庫bug_db中的Stat視圖。

image24

然后,點擊Finish以完成向導。這時,Excel會詢問將導入的數據放置於何處。選擇一個合適的單元格之后,點擊OK。

image29

這樣視圖Stat中的數據就呈現在Excel數據薄的表格中。

image35

此時,Rate列的小數部分過長,顯得不那么美觀。可以右擊列Rate所在列(即C列),選擇Format Cell,在彈出的對話框中選擇Percentage,然后點擊OK。

image38

image41

這樣,Rate列的數據被格式化為百分數。

image44

這時,可以將該表拷貝復制到Word或Outlook郵件中,作為分析報告的一部分。不過,一圖勝過千言萬語。不妨利用Excel的作圖功能,繪制出一幅反映數據分布的圖,以輔助說明數據表。Excel的作圖功能非常強大,在此不再贅述,只是展示一副基於該表的柱狀圖。從該圖可以看出,大部分Bug屬於code defect、design和performance。以此可以推測被測試程序有較多的性能問題。

image47

4. 數據更新

如果表格和圖需要反復使用,可以將數據薄保存。下次打開該數據薄,Excel會給出安全警告:數據連接被中斷。這時,需要點擊Options,並允許數據訪問。之后,Excel會重新導入數據,並更新基於導入數據的圖。數據庫中的數據變化可以自動地在數據薄中得到體現,實在是非常方便。

image53

image62

此外,如果需要手動更新數據,可以利用Data下的Refresh All。

image66

5. 小結

上述數據展示方法,是分層模型的一個實例。

  1. SQL Server是數據層,存儲了待展示的數據。
  2. Excel是展示層,存儲了數據格式化方法和圖表。
  3. SQL Server的視圖充當了邏輯層,存儲了計算邏輯。實際上,Excel的數據連接支持SQL查詢,但是我傾向於將SQL查詢以視圖的形式置於數據庫之中。第一,在Excel中編寫查詢比較困難,在SQL Server Management Studio中編寫查詢非常便捷。第二,置於SQL Server的計算邏輯可以被多個Excel數據薄共享。

分層模型充分發揮了SQL Server在數據存儲和操縱上的強大功能,以及Excel在數據表現和圖表制作的靈活性。不使用傳統意義上的“編程語言”,便快速地實現了數據獲取與展示的自動化。

參考文獻

  1. 韓小良,Excel+SQL Server數據庫管理技術詳解
  2. John Walkenbach,Excel 2007寶典


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM