2017-12-17 23 views
0

예제 코드 :TSQL - 범위와 그룹 병합 하시겠습니까?

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 

출력 :

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 | 

내가 다음 문자열을

TSQL 가입에 Sum(cal) > 5 완 - 2012 - 보고서 예

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) 

이, 제발 도와주세요 기대 문제를 해결할 수 있습니다.

+0

죄송합니다. 아직 해결책이 없습니다. –

+0

커서를 사용하여 저장 프로 시저 또는 함수로이를 수행 할 수 있습니다. 너에게 받아 들여질 수 있니? – Ezin82

+0

친애하는 Ezin82, 나는 질문을하고 싶다 : while과 cursor (가장 좋은 성능은 무엇인가? 왜냐하면, 행이 많기 때문에, 나는 그것을위한 최상의 성능을 생각해야한다.) 그리고 우리는 또 다른 해결책을 가져야 하는가? –

답변

0

커서를 사용하는 해결책입니다. 희망이 도움이 될 수 있습니다. 그것을 시도하고 성능이 받아 들여질 수 있는지보십시오.

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