請問各位大大
我是SQL的初學者,最近被要求做一個資料轉換
舊資料格式是
aaa1,aaa2,aaa3,aaa4,aaa5,aaa?,Com
aaa1,aaa2,aaa3,aaa?,Cmp2,OA
用[,]區隔
Cmp是分公司代碼,長度不定,有代碼表
OA是部門代碼,總公司的就省略,代碼表正在建立
左邊的aaa長度及數量都不一定,分很多層,這是個很古老的文檔資料庫的分類法
希望將相同Com或Cmp2,OA的都視為同一群組,左邊數量不固定的aaa就先算了
但麻煩的是我只會取代碼表的字串來比對,但那樣不準,因為aaa中也會出現跟公司碼一樣的字
我猜想可能是要從右邊抓[,]號做群組,但又不知道怎麼判斷要抓第1個或第2個逗號,因為部門代碼不一定會有,如果後面都一樣就好辦了
麻煩各位大大能幫忙想辦法
上帝愛你
我只能統計出
各公司-部門別 的加總筆數
雖然我不知道這麼做有什麼意義
不過程式碼如下提供參考
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;
謝謝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 [扣除右邊兩個,取得左邊文檔舊格式]
如果你改邪歸正
用 Postgres DB + Java
我幫你
上帝愛大家