2017-12-17 9 views
0

Beispielcode:TSQL - Gruppe mit Bereich zusammenführen?

Declare @table1 TABLE(myIndex int identity(1,1),[cal] int, Name Nvarchar(20)); 
Declare @range int = 5; 

INSERT INTO @table1 ([cal], Name) 
VALUES (1, 'A'), (3, 'B'), (4, 'C'), (2, 'D'), (3, 'E'), (4, 'F'), (6, 'G'), (2, 'H'); 

SELECT * FROM @table1 

Ausgang:

myIndex | Sum(cal) | Name | 
--------+----------+------+  
    1 | 1  | A | 
    2 | 3  | B | 
    3 | 4  | C | 
    4 | 2  | D | 
    5 | 3  | E | 
    6 | 4  | F | 
    7 | 6  | G | 
    8 | 2  | H | 

I wan Sum(cal) > 5 dann Zeichenfolge

TSQL beitreten - 2012 - Bericht Expect Beispiel

myIndex | Sum(cal) | Name | Description 
--------+----------+--------+-------------------------------- 
    1 | 7  | A,B,C | (Explain: First Sum(cal) > 5, Merge String) 
    2 | 9  | D,E,F | (Explain:Second Sum(cal) > 5, Merge String) 
    3 | 6  | G  | (Explain:Third, Sum(cal) > 5, Merge String) 
    4 | 2  | H  | (Explain:Last, still one last step) 

Bitte, hilf mir um die Probleme zu lösen.

+0

Entschuldigung, ich habe die Lösung noch nicht gefunden ?! –

+0

Sie können dies mit einer gespeicherten Prozedur oder einer Funktion mit einem Cursor tun. Ist das für dich akzeptabel? – Ezin82

+0

Lieber Ezin82, ich möchte Frage: While und Cursor (was ist die beste Leistung? Weil, es viele Zeilen, deshalb, muss ich die beste Leistung dafür denken. Und sollten wir eine andere Lösungen haben? –

Antwort

0

Dies ist eine Lösung mit einem Cursor. Hoffe, das könnte helfen. Probieren Sie es aus und prüfen Sie, ob die Leistung akzeptabel ist.

Declare @table1 TABLE(myIndex int identity(1,1),[cal] int, Name Nvarchar(20)); 
Declare @range int = 5; 

INSERT INTO @table1 ([cal], Name) 
VALUES (1, 'A'), (3, 'B'), (4, 'C'), (2, 'D'), (3, 'E'), (4, 'F'), (6, 'G'), (2, 'H'); 

SELECT * FROM @table1 

----- 
DECLARE @aggregates TABLE (myIndex int identity(1,1),SumCal int, AggregateNames Nvarchar(MAX)); 
DECLARE @SumCal INT 
     , @AggregateNames NVARCHAR(MAX) 
     , @cal INT 
     , @Name Nvarchar(20) 
     ; 

SET @SumCal = 0; 
SET @AggregateNames = NULL; 

DECLARE cur CURSOR LOCAL FAST_FORWARD FOR 
SELECT [cal], name from @table1 ORDER BY myIndex 

OPEN cur 

FETCH NEXT FROM cur INTO @cal, @Name 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @SumCal = @SumCal + @cal 
    SET @AggregateNames = ISNULL(@AggregateNames + ',', '') + @Name 
    IF @SumCal > 5 
     BEGIN 
      INSERT INTO @aggregates([SumCal], AggregateNames) 
      VALUES(@SumCal, @AggregateNames) 

      SET @SumCal = 0 
      SET @AggregateNames = NULL 
     END 

    FETCH NEXT FROM cur INTO @cal, @Name 
END 

IF @SumCal > 0 
    BEGIN 
    INSERT INTO @aggregates([SumCal], AggregateNames) 
    VALUES(@SumCal, @AggregateNames) 
    END 

CLOSE cur 

DEALLOCATE cur 

SELECT * FROM @aggregates 
Verwandte Themen