【MS SQL】SQL指令記錄

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