SQL指令記錄
雖然我覺得我的程式撰寫功力已經不強了。
可是,我必須承認SQL比程式對我而言還要難搞。
因為.......SQL的Google我更不會下。
公司有個主管對於SQL指令有種狂熱。
所以,老是有SQL指令都會請教他。
這次三天連假,他出了個考題給一些人,我主動的說我也要來解決。
問題描述在此:小弟發的問題
在此做個記錄。
當初主管給的提示是他使用了哪些關鍵字。
包含:七次Left Join、Min、Group by等。
我當天回家想破了頭就是都不出來,而且同時覺得...一定有更簡便的寫法&觀念。
為了不讓自己睡不著(我有病,程式寫不出來容易整夜睡不著),就上藍色小舖虛心求教啦。
結果,晚上十點多發問,依舊繼續研究,後來睡著了。
隔天,六點就驚醒,連牙都沒刷就看有無人回應哩!
皇天不負虛心人,pilipala大給個我心中的答案。
利用Row_Number()輕鬆的解決了問題。
此函數搭配著 OVER (PARTITION BY 群組的欄位 ORDER BY 排序的欄位 )
可以達到,將資料依照群組的欄位做一個資料行數計算。
假設資料表A資料行是:
| A欄位 | B欄位 |
| A | 1.doc |
| A | 2.doc |
| A | 3.doc |
| B | 4.doc |
| B | 5.doc |
| C | 6.doc |
語法:
1: Select A欄位,B欄位,Row_Number() over (partition by A欄位 order by B欄位)C欄位 from A
答案會變成:
| A欄位 | B欄位 | C欄位 |
| A | 1.doc | 1 |
| A | 2.doc | 2 |
| A | 3.doc | 3 |
| B | 4.doc | 1 |
| B | 5.doc | 2 |
| C | 6.doc | 1 |
你會清楚的看見,C欄位基本上就是每個A欄位分組然後用B欄位排序的順序。
利用這特質達到了我最終的目的。
後續的衍生是,當我不知道數量時,還有另外一種方式。
建立一個Function:
資料出處:另外一種考量方式(藍色小舖)
1: CREATE function getCommaString(@Title nvarchar) returns varchar(500) --500若不夠,請加大
2: begin
3: declare @str varchar(500) --500若不夠,請加大
4: set @str = ''
5: select @str = @str + FileName + ',' from FileList where Title=@Title order by ID
6: set @str = left(@str,len(@str)-1)
7: return @str
8: end
9:
10: select Title,dbo.getCommaString(Title) FROM (SELECT DISTINCT Title from FileList)a
以上做個學習記錄。
找不到答案其實,並不可恥。
勇於發問,同時持續學習不再出同樣的錯誤才是正途啊!
2011/10/11補充另外一種合併成一列的方式:
參考資料:http://social.msdn.microsoft.com/forums/zh-TW/240/thread/8eccd971-ef61-44e9-9931-7ba639659cb8
語法:
SELECT T1.Title,
(
SELECT T2.FileName + ''
FROM FileList T2
WHERE T2.Title = T1.Title
ORDER BY FileName
FOR XML PATH('')
) AS memo
FROM FileList T1
GROUP BY Title