2017-09-19 80 views
0

我在表中有2列:column1,priority。
他們的數據如下所示。來自2列的重複數據的計數器增量

+--------------------------+ 
|code | column1 | Priority | 
+--------------------------+ 
| 1001| 1  | 1  | 
| 1001| 2  | 1  | 
| 1002| 1  | 2  | 
| 1002| 2  | 2  | 
| 1003| 1  | 3  | 
| 1004| 2  | 4  | 
| 1005| 1  | 5  | 
| 1005| 2  | 5  | 
| 1006| 1  | 5  | 
| 1006| 2  | 5  | 
| 1007| 1  | 5  | 
| 1007| 2  | 5  | 
+--------------------------+ 

如果我通過

select 'con' + column1 + Priority 
from T1 

串連這2列我得到以下結果:

+---------------------------------------------+ 
|code | column1 | Priority | (No column name) | 
+--------------------------+------------------+ 
| 1001| 1  | 1  | con11   | 
| 1001| 2  | 1  | con21   | 
| 1002| 1  | 2  | con12   | 
| 1002| 2  | 2  | con22   | 
| 1003| 1  | 3  | con13   | 
| 1004| 2  | 4  | con24   | 
| 1005| 1  | 5  | con15   | 
| 1005| 2  | 5  | con25   | 
| 1006| 1  | 5  | con15   | 
| 1006| 2  | 5  | con25   | 
| 1007| 1  | 5  | con15   | 
| 1007| 2  | 5  | con25   | 
+--------------------------+------------------+ 

但我需要的值要像以下: 一樣,如果級聯數值已經存在比在下一個優先級列值中遞增並且將其與列1連接在一起。 E:如果15比增量已經存在於優先值g,使其比6和串聯得到16同樣爲25至26

+---------------------------------------------+ 
|code | column1 | Priority | (No column name) | 
+--------------------------+------------------+ 
| 1001| 1  | 1  | con11   | 
| 1001| 2  | 1  | con21   | 
| 1002| 1  | 2  | con12   | 
| 1002| 2  | 2  | con22   | 
| 1003| 1  | 3  | con13   | 
| 1004| 2  | 4  | con24   | 
| 1005| 1  | 5  | con15   | 
| 1005| 2  | 5  | con25   | 
| 1006| 1  | 5  | con16   | 
| 1006| 2  | 5  | con26   | 
| 1007| 1  | 5  | con17   | 
| 1007| 2  | 5  | con27   | 
+--------------------------+------------------+ 
+0

這聽起來像一個維護的噩夢,也容易出錯。你有沒有看過使用自動增量列?那失敗了,你是否考慮過在查詢時簡單地生成你想要的序列? –

+0

是sql server 2008還是2012? c#和它有什麼關係? –

+0

聽起來像壞的數據庫設計 – Magisch

回答

1

試試這個

select code,column1, Priority, 
    concat('con', column1, Priority - 1 + row_number() over(partition by Priority, column1 order by code)) 
from myTable 
order by code, column1; 

這將返回一行

1007 3 5 con35 

1007 3 5 

添加到myTable的。不知道這是否正確。

編輯如果你的數據庫兼容級別是08或更低的使用

'con' + cast (column1 as varchar(20)) + cast(Priority - 1 + row_number() over(partition by Priority, column1 order by code) as varchar(20)) 

,如果您需要在添加1007 3 5con37,試試這個

select code,column1, Priority, cn ='con' + cast (column1 as varchar(20)) + cast(max(n) over (partition by code) as varchar(20)) 
from (
    select code,column1, Priority, n=Priority - 1 + row_number() over(partition by Priority, column1 order by code) 
    from myTable 
) t 
order by code, column1 
+0

'concat'不是一個公認的內置函數名稱。 安裝了sql server 2012,但是安裝了 SELECT @@ VERSION;在Windows NT 6.1 10.50.1617.0(X64) \t 2011年4月22日19點23分43秒 \t版權所有(c)Microsoft公司 \t企業版(64位) - 正在恢復的Microsoft SQL Server 2008 R2(RTM) (內部版本7601:Service Pack 1)(管理程序) – Brainiac

+0

@Serg正如我在回答中所提到的,它不適用於任何數據... –

+0

@RadimBača,請參閱編輯 – Serg

1

好吧,我有這樣只能在某些情況下(例如半的解決方案爲您的示例數據)。

select column1, priority, 
    'con' + CAST(column1 AS VARCHAR(10)) + 
      CAST((row_number() over (partition by column1, priority order by priority) + priority - 1) AS VARCHAR(10)) 
from tab 

如果將例如(1,6)插入到您的數據中,那麼您將有兩次con16問題。 Here是有問題的數據解決方案的一個例子。

+0

'concat'不是公認的內置函數名稱。 安裝了sql server 2012,但是安裝了 SELECT @@ VERSION;在Windows NT 6.1 10.50.1617.0(X64) \t 2011年4月22日19點23分43秒 \t版權所有(c)Microsoft公司 \t企業版(64位) - 正在恢復的Microsoft SQL Server 2008 R2(RTM) (內部版本7601:Service Pack 1)(管理程序) – Brainiac

+0

@Brainiac嘿腦殘,用例如'CAST'代替。連接是一個有據可查的問題 –

+0

可以給我示例查詢SQL Server 2008 R2 – Brainiac