> 데이터 베이스 > MySQL 튜토리얼 > 데이터 분석을 위해 SQL에서 열을 동적으로 생성하는 방법은 무엇입니까?

데이터 분석을 위해 SQL에서 열을 동적으로 생성하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-09 15:36:41
원래의
510명이 탐색했습니다.

How to Dynamically Generate Columns in SQL for Data Analysis?

SQL에서 동적으로 열 생성

SQL의 동적 열 생성을 통해 동적 입력을 기반으로 유연한 데이터 구조 구축이 가능합니다. 다음 시나리오를 고려해보세요.

  • Customers 고객 세부정보(ID 및 이름)가 포함된 테이블
  • CustomerRewards 테이블에는 보상 유형(TypeID 및 설명)이 포함되어 있습니다.
  • Rewards 고객과 리워드를 연결하는 테이블

목표는 보상 유형을 나타내는 열을 동적으로 생성하고 각 유형의 고객 보상 수를 계산하는 것입니다.

이를 위해 SQL의 PIVOT 함수를 사용할 수 있습니다.

<code class="language-sql">SELECT
  name,
  [Bronze],
  [Silver],
  [Gold],
  [Platinum],
  [AnotherOne]
FROM
  (
    SELECT
      c.name,
      cr.description,
      r.typeid
    FROM
      customers AS c
    LEFT JOIN
      rewards AS r
      ON c.id = r.customerid
    LEFT JOIN
      customerrewards AS cr
      ON r.typeid = cr.typeid
  ) AS x
PIVOT
  (
    COUNT(typeid)
    FOR description IN ([Bronze], [Silver], [Gold], [Platinum], [AnotherOne])
  ) AS p;</code>
로그인 후 복사

여기서 PIVOT 함수는 description 필드를 기준으로 행을 열로 변환하여 각 보상 유형에 대한 개수를 표시합니다.

열 개수를 알 수 없는 경우 동적 SQL을 사용할 수 있습니다.

<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX),
    @query AS NVARCHAR(MAX);

SELECT
  @cols = STUFF(
    (
      SELECT
        ',' + QUOTENAME(description)
      FROM
        customerrewards
      GROUP BY
        description,
        typeid
      ORDER BY
        typeid
      FOR XML PATH(''),
      TYPE
    ).value('.', 'NVARCHAR(MAX)'),
    1,
    1,
    ''
  );

SET
  @query = 'SELECT name, ' + @cols + ' FROM 
             (
                SELECT
                  c.name,
                  cr.description,
                  r.typeid
                FROM
                  customers AS c
                LEFT JOIN
                  rewards AS r
                  ON c.id = r.customerid
                LEFT JOIN
                  customerrewards AS cr
                  ON r.typeid = cr.typeid
            ) AS x
            PIVOT 
            (
                COUNT(typeid)
                FOR description IN (' + @cols + ')
            ) AS p ';

EXECUTE (@query);</code>
로그인 후 복사

동적 쿼리는 customerrewards 테이블의 값을 기반으로 열을 생성합니다.

'합계' 열을 포함하려면 ROLLUP 연산자를 사용할 수 있습니다.

<code class="language-sql">SELECT
  name,
  SUM([Bronze]) AS Bronze,
  SUM([Silver]) AS Silver,
  SUM([Gold]) AS Gold,
  SUM([Platinum]) AS Platinum,
  SUM([AnotherOne]) AS AnotherOne
FROM
  (
    SELECT
      name,
      [Bronze],
      [Silver],
      [Gold],
      [Platinum],
      [AnotherOne]
    FROM
      (
        SELECT
          c.name,
          cr.description,
          r.typeid
        FROM
          customers AS c
        LEFT JOIN
          rewards AS r
          ON c.id = r.customerid
        LEFT JOIN
          customerrewards AS cr
          ON r.typeid = cr.typeid
      ) AS x
      PIVOT
      (
        COUNT(typeid)
        FOR description IN ([Bronze], [Silver], [Gold], [Platinum], [AnotherOne])
      ) AS p
  ) AS x1
GROUP BY
  name
WITH ROLLUP;</code>
로그인 후 복사

동적으로 열을 생성하면 변화하는 데이터 구조를 효율적으로 처리하고 데이터를 포괄적인 방식으로 표시할 수 있습니다.

위 내용은 데이터 분석을 위해 SQL에서 열을 동적으로 생성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿