[SQL] SQL에 소계 행을 추가하는 방법 [마감]
SQLSQL에 소계 행을 추가하는 방법 [마감]
나는 다음과 같은 데이터가있는 테이블이 있습니다
Name Score
A 2
B 3
A 1
B 3
나는 다음과 같은 출력을 제공하는 쿼리를 원한다.
Name Score
A 2
A 1
Subtotal 3
B 3
B 3
Subtotal 6
는 SQL 코드를 도와주세요
해결법
-
==============================
1.일반적으로,이 같은 것입니다 :
일반적으로,이 같은 것입니다 :
select Name, Score from ( select Name, Score, Name as o from Table1 as a union all select 'Subtotal', sum(Score), Name as o from Table1 as a group by Name ) as a order by o, score
그러나, @ypercube 말한 것처럼, 다른 RDBMS에서 다른 특정 구현을 거기. 당신의 작업 테이블이 기본 키를 가지고 있지 않기 때문에 당신이 ROW_NUMBER () 함수를 에뮬레이트 할 수 있도록 조금, 복잡. SQL Server의 경우 세트를 그룹화 사용할 수 있습니다 :
with cte as ( select *, row_number() over(order by newid()) as rn from Table1 ) select case when grouping(c.rn) = 1 then 'Subtotal' else c.Name end as Name, sum(c.Score) as Score from cte as c group by grouping sets ((c.Name), (c.Name, c.rn)) order by c.Name;
또는 롤업 () :
with cte as ( select *, row_number() over(order by newid()) as rn from Table1 ) select case when grouping(c.rn) = 1 then 'Subtotal' else c.Name end as Name, sum(c.Score) as Score from cte as c group by rollup(c.Name, c.rn) having grouping(c.Name) = 0 order by c.Name;
정적 '소계'문자열 이름 열을 대체 할 수있는 그룹화 () 함수를합니다. 또한 메모, 열의 순서는 롤업 () 쿼리에 중요.
=> SQL 바이올린 데모
-
==============================
2.(MySQL과 SQL-Server와 같은) 일부 DBMS 수정 같은 쿼리에 사용할 수있는 GROUP BY 절의 WITH ROLLUP 있습니다 :
(MySQL과 SQL-Server와 같은) 일부 DBMS 수정 같은 쿼리에 사용할 수있는 GROUP BY 절의 WITH ROLLUP 있습니다 :
SELECT pk, name, SUM(score) AS score FROM tableX GROUP BY name, pk -- pk is the PRIMARY KEY of the table WITH ROLLUP ;
SQL-바이올린에서 테스트
다른 DBMS (SQL-서버, 오라클) 세트 사용 (및 WITH ROLLUP보다 더 강력하다) 할 수있는 기능을 그룹화하여 그룹을 구현 한 :
SELECT pk, name, SUM(score) AS score FROM tableX GROUP BY GROUPING SETS ((name, pk), (name), ());
에서 테스트 SQL-바이올린-2
@AndriyM는 (SQL-바이올린 2 위 업데이트 참조)도 동일한 결과와 GROUP BY ROLLUP (Oracle 및 SQL-Server에서 구현)이 있음을 나 수정 :
SELECT pk, name, SUM(score) AS score FROM t GROUP BY ROLLUP (name, pk) ;
-
==============================
3.당신은 무엇을 보여주고있다하는 것은 보고서의 더 많은 것이다. 당신은 응용 프로그램 논리 또는보고 도구를 사용할 수 있습니다. 제 질의 표시는 플레이어의 값의리스트를 정렬하고, 두 번째 질의 실제 합을 얻는다.
당신은 무엇을 보여주고있다하는 것은 보고서의 더 많은 것이다. 당신은 응용 프로그램 논리 또는보고 도구를 사용할 수 있습니다. 제 질의 표시는 플레이어의 값의리스트를 정렬하고, 두 번째 질의 실제 합을 얻는다.
select name, score from playerscore order by name asc select name, sum(score) from playerscore group by name
-
==============================
4.SQL을 출력하여 행을 나열하고 총을 행이 값을 변경 할 때마다 인쇄하도록 설계되지 않았습니다. 이러한 출력은 정말 최고의, 당신이 "A"하여 SQL 출력을 주문할 것이다 응용 프로그램 수준에서 수행 점수 열 소계에 계속 추가하고, 응용 프로그램이 "B"로 변화를 감지 할 때 그것은 행을 삽입 할 것입니다 당신이 여기에 표시된 것처럼, 소계를 표시. "B"로 변경하면 그 다음은 합계를 재설정합니다. 나는 선택 이름으로 시작 이름으로 목차 주문에서 점수와 다음 응용 프로그램의 나머지 부분을 처리 할 것입니다. 이 쿼리를 건너 뛸 수 있다면, 당신은 직접 SQL 서버와 합계를 할 수 있기 때문에 개별 점수 결과의 행을 필요로하는 경우 정말이라고 생각하지만, 당신은 단지 이름으로 합계를 얻을 것입니다.
SQL을 출력하여 행을 나열하고 총을 행이 값을 변경 할 때마다 인쇄하도록 설계되지 않았습니다. 이러한 출력은 정말 최고의, 당신이 "A"하여 SQL 출력을 주문할 것이다 응용 프로그램 수준에서 수행 점수 열 소계에 계속 추가하고, 응용 프로그램이 "B"로 변화를 감지 할 때 그것은 행을 삽입 할 것입니다 당신이 여기에 표시된 것처럼, 소계를 표시. "B"로 변경하면 그 다음은 합계를 재설정합니다. 나는 선택 이름으로 시작 이름으로 목차 주문에서 점수와 다음 응용 프로그램의 나머지 부분을 처리 할 것입니다. 이 쿼리를 건너 뛸 수 있다면, 당신은 직접 SQL 서버와 합계를 할 수 있기 때문에 개별 점수 결과의 행을 필요로하는 경우 정말이라고 생각하지만, 당신은 단지 이름으로 합계를 얻을 것입니다.
from https://stackoverflow.com/questions/19387650/how-to-add-a-subtotal-row-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SHOW ALL은 두 날짜 사이의 데이터를 날짜; 어떤 행이 특정 날짜에 대해 존재하지 않는 경우 모든 열이 제로를 표시 (0) | 2020.05.25 |
---|---|
[SQL] 어떻게 SQL에서 지난 주 마지막 날을 얻으려면? (0) | 2020.05.25 |
[SQL] 어떻게 하나 개의 레코드에 SQL에 널 (null) 값으로 모든 필드를 계산하려면? (0) | 2020.05.25 |
[SQL] 분할 문자열 행 오라클 SQL로 (0) | 2020.05.24 |
[SQL] C # SQL 삽입 명령 (0) | 2020.05.24 |