iT邦幫忙

0

請問MS SQL將同字尾的資料做成群組

請問各位大大
我是SQL的初學者,最近被要求做一個資料轉換
舊資料格式是
aaa1,aaa2,aaa3,aaa4,aaa5,aaa?,Com
aaa1,aaa2,aaa3,aaa?,Cmp2,OA
用[,]區隔
Cmp是分公司代碼,長度不定,有代碼表
OA是部門代碼,總公司的就省略,代碼表正在建立
左邊的aaa長度及數量都不一定,分很多層,這是個很古老的文檔資料庫的分類法

希望將相同Com或Cmp2,OA的都視為同一群組,左邊數量不固定的aaa就先算了
但麻煩的是我只會取代碼表的字串來比對,但那樣不準,因為aaa中也會出現跟公司碼一樣的字
我猜想可能是要從右邊抓[,]號做群組,但又不知道怎麼判斷要抓第1個或第2個逗號,因為部門代碼不一定會有,如果後面都一樣就好辦了

麻煩各位大大能幫忙想辦法

上帝愛你

看更多先前的討論...收起先前的討論...
slime iT邦大師 1 級 ‧ 2014-10-24 08:38:20 檢舉
資料量多大? 結構如何?

如果結構不太複雜, 資料量不大, 我會考慮用人工轉換或 Excel 吧.
關於發問的方式,參考一下這篇:

http://ithelp.ithome.com.tw/question/10142917
josephine iT邦新手 4 級 ‧ 2014-10-24 16:04:49 檢舉
不好意思,看不懂
把Table結構描述清楚,挑幾筆代表性的資料,另外將最後要達到的結果,好好描述一下.
放那種aaaa的,不容易看懂得.
為什麼這類的話,我時常要說,問問題的人,好像都以為別人有特異
功能,可以看到他那裡的Table跟資料.
josephine iT邦新手 4 級 ‧ 2014-10-24 16:08:09 檢舉
網路上找得到的答案都是抓第一個逗點,沒找到抓第二第三個逗點的,所以不知道怎麼辦
excel不熟
幸好已經解決了,謝謝
josephine iT邦新手 4 級 ‧ 2014-10-24 16:11:14 檢舉
好,謝謝
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
海綿寶寶
iT邦大神 1 級 ‧ 2014-10-24 10:44:47
最佳解答

我只能統計出
各公司-部門別 的加總筆數

雖然我不知道這麼做有什麼意義
不過程式碼如下提供參考

1.建立 Table及測試資料

<pre class="c" name="code">
CREATE TABLE Table1
	([f1] varchar(50))
;
	
INSERT INTO Table1
	([f1])
VALUES
	(
      'aaa1,aaa2,aaa3,aaa4,aaa5,aaa?,Com'),
      ('aaa1,aaa2,aaa3,aaa?,C,OA'),
      ('aaa1,aaa2,aaa3,aaa?,Cm,OA'),
      ('aaa1,aaa2,aaa3,aaa?,Cmp,OA'),
      ('aaa1,aaa2,aaa3,aaa?,Cmp2,OA'),
      ('aaa1,aaa2,aaa3,aaa?,C,O'),
      ('aaa1,aaa2,aaa3,aaa?,Cm,O'),
      ('aaa1,aaa2,aaa3,aaa?,Cm,O'),
      ('aaa1,aaa2,aaa3,aaa?,Cmp,O'),
      ('aaa1,aaa2,aaa3,aaa?,Cmp2,O')   
;

2.SQL 指令

<pre class="c" name="code">
SELECT 

CASE

WHEN Reverse(left(reverse(f1), charindex(',', reverse(f1)) -1)) = 'Com' THEN 'Com,Com'
ELSE Reverse(left(reverse(f1), charindex(',', reverse(f1), charindex(',', reverse(f1))+1)-1))

END,

COUNT(*)
                                                      
FROM table1

GROUP BY CASE Reverse(left(reverse(f1), charindex(',', reverse(f1)) -1)) WHEN 'Com' THEN 'Com,Com'
         ELSE Reverse(left(reverse(f1), charindex(',', reverse(f1), charindex(',', reverse(f1))+1)-1)) END;
josephine iT邦新手 4 級 ‧ 2014-10-24 15:57:37 檢舉

謝謝antijava
讓我有靈感,reverse是重點,先這樣解決
雖然遇到沒部門碼的會出錯,但週末快到了^^
上帝愛你

DECLARE @path NVARCHAR(100) = 'aaa1,aaa2,aaa3,aaa?,Cmp2,OA' -- 抓分公司代碼表
DECLARE @ON NVARCHAR(100) = (SELECT right(@path,Charindex(',',reverse(@path))-0))
DECLARE @R1 NVARCHAR(100) = (SELECT Charindex(',',reverse(@path)))
DECLARE @R1_Name NVARCHAR(100) = (SELECT REPLACE(@path,@ON,''))
DECLARE @R2 NVARCHAR(100) = (SELECT Charindex(',',reverse(@R1_Name)))
DECLARE @R2_Name NVARCHAR(100) = (SELECT RIGHT(@R1_Name,@R2))

select @ON AS [部門碼]
select @R2_Name AS [分公司碼]
Select SUBSTRING(@path,1,len(@path)-@R1-@R2) as [扣除右邊兩個,取得左邊文檔舊格式]

0
Albert
iT邦高手 1 級 ‧ 2014-10-23 14:29:55

如果你改邪歸正
用 Postgres DB + Java
我幫你

上帝愛大家

summertw iT邦好手 1 級 ‧ 2014-10-24 08:03:41 檢舉

大哥...您是IS的嗎??
眾人皆邪,你獨正.....????????這是何道理???????

我要發表回答

立即登入回答