2017-09-19 1 views
0

Ich habe 2 Spalten in einer Tabelle: Spalte1, Priorität.
Ihre Daten sehen wie folgt aus.Zählerinkrement für doppelte Daten aus 2 Spalten

+--------------------------+ 
|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  | 
+--------------------------+ 

wenn ich diese zwei Spalten verketten von

select 'con' + column1 + Priority 
from T1 

mir folgendem Ergebnis:

+---------------------------------------------+ 
|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   | 
+--------------------------+------------------+ 

Aber meine erforderlichen Werte wie seine folgenden: wie wenn verketteten Wert bereits vorhanden als den nächsten Priority-Spaltenwert zu erhöhen und dann mit column1 zu verketten. e: g, wenn 15 existiert bereits als Zuwachs in Prioritätswert, um es 6 zu machen als verketten und 16 gleiche gilt für 25 bis 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

Dieses wie ein Alptraum in Sachen Wartung klingt und auch fehleranfällig. Haben Sie die Verwendung einer Autoinkrement-Spalte untersucht? Haben Sie darüber nachgedacht, einfach die Sequenz zu generieren, die Sie bei der Abfrage spontan benötigen? –

+0

Ist es SQL Server 2008 oder 2012? Was hat C# damit zu tun? –

+0

Klingt wie schlecht DB-Design – Magisch

Antwort

1

Versuchen Sie, diese

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; 

Dies wird eine Zeile zurückgeben

1007 3 5 con35 

wenn

1007 3 5 

zu myTable hinzugefügt wird. Ich weiß nicht, ob es richtig ist.

EDIT wenn Ihr db Kompatibilitätsgrad 2008 oder niedriger Verwendung ist

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

Und wenn Sie con37 benötigen, wenn 1007 3 5 hinzugefügt wird, versuchen Sie diese

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‘ ist keine anerkannte integrierte Funktion Namen. SQL Server 2012 installiert, aber SELECT @@ VERSION; kehrt Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) \t 22. April 2011 19.23.43 \t Copyright (c) Microsoft Corporation \t Enterprise Edition (64-Bit) unter Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor) – Brainiac

+0

@Serg wie in meiner Antwort erwähnt, wird es für keine Daten funktionieren ... –

+0

@ RadimBača, siehe bearbeiten – Serg

1

Ok, ich habe eine halbe Lösung, die nur unter bestimmten Umständen (zum Beispiel funktioniert für Ihre Beispieldaten).

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 

Das Problem tritt auf, wenn Sie zum Beispiel (1,6) in Ihre Daten einfügen, dann werden Sie CON16 zweimal haben. Here ist ein Beispiel für die Lösung mit problematischen Daten.

+0

"Concat" ist kein anerkannter Name einer integrierten Funktion. SQL-Server 2012 ist installiert, aber SELECT @@ VERSION; kehrt Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (X64) \t 22. April 2011 19.23.43 \t Copyright (c) Microsoft Corporation \t Enterprise Edition (64-Bit) unter Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor) – Brainiac

+0

@ Brainiac hey brainiac, verwenden Sie zum Beispiel "CAST" statt. Verkettungs ist ein gut dokumentiertes Problem –

+0

u kann mir Beispiel Abfrage geben für SQL Server 2008 R2 – Brainiac

Verwandte Themen