복붙노트

[SQL] SQL에 소계 행을 추가하는 방법 [마감]

SQL

SQL에 소계 행을 추가하는 방법 [마감]

나는 다음과 같은 데이터가있는 테이블이 있습니다

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. ==============================

    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. ==============================

    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. ==============================

    3.당신은 무엇을 보여주고있다하는 것은 보고서의 더 많은 것이다. 당신은 응용 프로그램 논리 또는보고 도구를 사용할 수 있습니다. 제 질의 표시는 플레이어의 값의리스트를 정렬하고, 두 번째 질의 실제 합을 얻는다.

    당신은 무엇을 보여주고있다하는 것은 보고서의 더 많은 것이다. 당신은 응용 프로그램 논리 또는보고 도구를 사용할 수 있습니다. 제 질의 표시는 플레이어의 값의리스트를 정렬하고, 두 번째 질의 실제 합을 얻는다.

    select
        name,
        score
    from playerscore
    order by name asc
    
    select
        name,
        sum(score)
    from playerscore
    group by name
    
  4. ==============================

    4.SQL을 출력하여 행을 나열하고 총을 행이 값을 변경 할 때마다 인쇄하도록 설계되지 않았습니다. 이러한 출력은 정말 최고의, 당신이 "A"하여 SQL 출력을 주문할 것이다 응용 프로그램 수준에서 수행 점수 열 소계에 계속 추가하고, 응용 프로그램이 "B"로 변화를 감지 할 때 그것은 행을 삽입 할 것입니다 당신이 여기에 표시된 것처럼, 소계를 표시. "B"로 변경하면 그 다음은 합계를 재설정합니다. 나는 선택 이름으로 시작 이름으로 목차 주문에서 점수와 다음 응용 프로그램의 나머지 부분을 처리 할 것입니다. 이 쿼리를 건너 뛸 수 있다면, 당신은 직접 SQL 서버와 합계를 할 수 있기 때문에 개별 점수 결과의 행을 필요로하는 경우 정말이라고 생각하지만, 당신은 단지 이름으로 합계를 얻을 것입니다.

    SQL을 출력하여 행을 나열하고 총을 행이 값을 변경 할 때마다 인쇄하도록 설계되지 않았습니다. 이러한 출력은 정말 최고의, 당신이 "A"하여 SQL 출력을 주문할 것이다 응용 프로그램 수준에서 수행 점수 열 소계에 계속 추가하고, 응용 프로그램이 "B"로 변화를 감지 할 때 그것은 행을 삽입 할 것입니다 당신이 여기에 표시된 것처럼, 소계를 표시. "B"로 변경하면 그 다음은 합계를 재설정합니다. 나는 선택 이름으로 시작 이름으로 목차 주문에서 점수와 다음 응용 프로그램의 나머지 부분을 처리 할 것입니다. 이 쿼리를 건너 뛸 수 있다면, 당신은 직접 SQL 서버와 합계를 할 수 있기 때문에 개별 점수 결과의 행을 필요로하는 경우 정말이라고 생각하지만, 당신은 단지 이름으로 합계를 얻을 것입니다.

  5. from https://stackoverflow.com/questions/19387650/how-to-add-a-subtotal-row-in-sql by cc-by-sa and MIT license