2011年3月30日 星期三

SQL 2005 PIVOT多欄彙總

微軟的SQL Server產品在SQL 2005開始就支援PIVOT,但從線上叢書通常看到PIVOT範例只有一個彙總欄位,以下的語法是利用SQL 2005的範例資料庫AdventureWorks,呈現2001-07-01到2001-07-07銷售明細產品每日的訂購數加總及產品每日的銷售加總

SELECT
ProductName,
SUM(ISNULL([1_Q], 0)) [1_Q], SUM(ISNULL([2_Q], 0)) [2_Q], SUM(ISNULL([3_Q], 0)) [3_Q], SUM(ISNULL([4_Q], 0)) [4_Q], SUM(ISNULL([5_Q], 0)) [5_Q], SUM(ISNULL([6_Q], 0)) [6_Q], SUM(ISNULL([7_Q], 0)) [7_Q],
SUM(ISNULL([1_A], 0)) [1_A], SUM(ISNULL([2_A], 0)) [2_A], SUM(ISNULL([3_A], 0)) [3_A], SUM(ISNULL([4_A], 0)) [4_A], SUM(ISNULL([5_A], 0)) [5_A], SUM(ISNULL([6_A], 0)) [6_A], SUM(ISNULL([7_A], 0)) [7_A]
FROM
(
SELECT
p.Name AS ProductName,
SUM(d.OrderQty) AS OrderQty,
SUM(d.LineTotal) AS LineTotal,
CAST(DAY(d.ModifiedDate) AS VARCHAR) + '_Q' AS D1,
CAST(DAY(d.ModifiedDate) AS VARCHAR) + '_A'AS D2
FROM Sales.SalesOrderDetail AS d
INNER JOIN Production.Product AS p ON d.ProductID = p.ProductID
WHERE d.ModifiedDate BETWEEN '2001-07-01' AND '2001-07-07'
GROUP BY p.Name, d.ModifiedDate
) p
PIVOT
(
SUM (OrderQty)
FOR D1 IN
( [1_Q], [2_Q], [3_Q], [4_Q], [5_Q], [6_Q], [7_Q])
) AS pvt1
PIVOT
(
SUM(LineTotal)
FOR D2 IN
( [1_A], [2_A], [3_A], [4_A], [5_A], [6_A], [7_A])
) AS pvt2
GROUP BY ProductName

上面的語法有用到一些小技巧,因為要求出每日的訂購數及銷售加總,所以日期欄位需要二個,一個給訂購數一個給銷售加總,這裡我們用D1代表訂購數的日期D2代表銷售加總的日期,另外SELECT清單需要14個欄位,其中7個欄位代表1~7日的訂購數,其餘7個欄位代表1~7日的銷售加總數,為了有所區別在訂購數的日期後加上_Q如1_Q,銷售加總日期後加上_A如1_A,最後注意在SUM函數裡要用ISNULL避免加總時因為有值為NULL造成結果為NULL。

2011年3月20日 星期日

table-layout

在網頁中我們常用table來呈現資料,但有時儲存格的內容有較長的單字或數字超過欄位寬度的設定,這時就會發生原先版面的設計跑掉,那我們應如何解決這個問題呢?答案就是利用table-layout:fixed; word-break:break-all,下面我們將以圖例說明

table總寬度為200px,有二個欄位各100px


網頁呈現畫面,雖然欄位設定為各100px,但由於數字的長度已大於欄位的寛度,所以版面跑掉。


修改原始碼,在table的style增加table-layout:fixed


網頁呈現畫面,這裡注意雖然版面正常了,但數字部份被截掉一些


再次修改原始碼,增加word-break:break-all


網頁呈現畫面


在上方的圖例是以IE 6做為測試用的瀏覽器,如果有興趣的人也可以測試其他瀏覽器,另外word-break:break-all的語法是以每個字完做結尾,如果網頁內容主要是以英文為主並且是給西方人觀看,這時候單字因為會被強迫折行,造成語意不清,所以使用上要注意。

2011年3月18日 星期五

將USB隨身碟由FAT32格式轉成NTFS

會寫這篇的原因是經常有朋友問我,為什麼他們的檔案從PC Copy到隨身碟會發生錯誤,我第一個直覺通常會問"你的檔案有沒有超過4G",在我們日常生活中使用的隨身碟通常格式都為FAT32,而FAT32有個限制就是單一檔案無法超過4G,那有沒有辦法突破這個限制,答案是有的,以下提供二種方法

方法1:轉換FAT32=>NTFS
以XP系統為例,在[開始]=>[執行]輸入cmd,此時會出現命令提示字元視窗,再輸入
convert 隨身碟磁碟機代號: /fs:ntfs

方法2:格式化
以XP系統為例,在系統預設的情況下是無法格式化隨身碟為NTFS,必須要經由一些設定,設定如下

1.插入隨身碟

2.在[我的電腦]按右鍵點選[電腦管理]再點[選裝置管理員],選擇[磁碟機]中的隨身碟裝置

3.按右鍵選擇[內容],切換至[原則]頁籤設定[效能最佳化]

4.在格式化隨身碟時[檔案系統]選擇NTFS

那方法1與方法2有什麼差異呢?差異在方法2無法保存隨身碟的資料,如果隨身碟有資料時可選擇方法1

三門問題

有許久沒有寫blog了,會寫這篇是因為上課時聽到老師精闢的解說,所以借花獻佛分享給大家,以下是三門問題的解說

為遊戲節目,三個門中其中一個門後方有車子,其餘二個門為山羊,參賽者先選擇一個門後,主持人會開啟另一個門會出現山羊(主持人一定會開門且出現的一定是山羊),當主持人問參賽者時,參賽者是否要換

門後的東西:羊1、羊2、車

可獲得機率為66%
if 參賽者原選羊1 then 車 (主持人開羊2)
if 參賽者原選羊2 then 車 (主持人開羊1)
if 參賽者原選車 then 羊 (主持人開羊)

不換可獲得機率為33%
if 參賽者原選羊1 then 羊1 (主持人開羊2)
if 參賽者原選羊2 then 羊2 (主持人開羊1)
if 參賽者原選車 then 車 (主持人開羊)

原本三個門選一個得到車子的機率為1/3,但在主持人會開另一個門且一定為羊,並給予參賽者更換門的機會,參賽者如果選擇換,得到車子的機率會從33%->66%,雖然網路上有其他人的論點為50%,但我認為是66%,有興趣的看倌不訪上網查詢三門問題。