2013-10-18 2 views
-1

에서 :이 결과를 생성하기 위해 동일한 순서로 그룹 Status 합계해야연속하여 SQL 서버 그룹이 테이블

+----+--------+-------+ 
| ID | Status | Value | 
+----+--------+-------+ 
| 1 |  1 |  4 | 
| 2 |  1 |  7 | 
| 3 |  1 |  9 | 
| 4 |  2 |  1 | 
| 5 |  2 |  7 | 
| 6 |  1 |  8 | 
| 7 |  1 |  9 | 
| 8 |  2 |  1 | 
| 9 |  0 |  4 | 
| 10 |  0 |  3 | 
| 11 |  0 |  8 | 
| 12 |  1 |  9 | 
| 13 |  3 |  1 | 
+----+--------+-------+ 

.

+--------+------------+ 
| Status | Sum(Value) | 
+--------+------------+ 
|  1 |   20 | 
|  2 |   8 | 
|  1 |   17 | 
|  2 |   1 | 
|  0 |   15 | 
|  1 |   9 | 
|  3 |   1 | 
+--------+------------+ 

SQL Server에서 어떻게 할 수 있습니까?

NB : ID 열의 값은 연속적입니다.

+0

'ID'값이 연속적인지 보장 되나요? 연속적으로 보장되지 않으면 'ID = 2'행이 누락 된 경우 어떻게 될까요? Ids가 '1'과 '3'인 행은 여전히 ​​동일한 그룹으로 간주됩니까? 또한 이미지를 제거하고 예제 데이터를 텍스트 형식으로 제공하십시오. 이는 잠재적 인 응답자가 테스트 테이블을 직접 입력하지 않고도 설정하는 것이 더 쉬워 질뿐만 아니라 액세스가 용이합니다. 예를 들어 SQL Server 태그가 붙은 다른 질문을보십시오. –

+0

예, ID 값은 연속적이어야합니다. –

답변

4

태그 당 나는 당신의 질문에 틈과 섬 문제입니다. ID 값은 다음 명시된대로 CTE 정의에 대신

ROW_NUMBER() OVER (ORDER BY [ID]) - 
     ROW_NUMBER() OVER (PARTITION BY [STATUS] ORDER BY [ID]) AS Grp 

을 사용해야합니다 연속 보장되지 않은 경우

가장 좋은 성능의 솔루션은 가능성이

WITH T 
    AS (SELECT *, 
       ID - ROW_NUMBER() OVER (PARTITION BY [STATUS] ORDER BY [ID]) AS Grp 
     FROM YourTable) 
SELECT [STATUS], 
     SUM([VALUE]) AS [SUM(VALUE)] 
FROM T 
GROUP BY [STATUS], 
      Grp 
ORDER BY MIN(ID) 

될 것입니다.

SQL Fiddle

+0

이것이 작동하는 이유에 대해 자세히 설명해 주시겠습니까? 특히 경험이없는 사람들에게는 명확하지 않습니다. –

+0

@arturo 모바일에 순간. http://www.manning.com/nielsen/SampleChapter5.pdf에서 5 장 다운로드를 참조하십시오. –