> 데이터 베이스 > MySQL 튜토리얼 > 데이터 마이닝을 위해 SQL에서 개수가 포함된 열을 동적으로 생성하는 방법은 무엇입니까?

데이터 마이닝을 위해 SQL에서 개수가 포함된 열을 동적으로 생성하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2025-01-09 15:27:43
원래의
840명이 탐색했습니다.

How to Dynamically Generate Columns with Count in SQL for Data Mining?

SQL을 사용하여 동적으로 열 생성

이 기사에서는 데이터 마이닝 분야의 일반적인 문제, 즉 동적 데이터를 기반으로 열을 동적으로 생성하는 문제에 대해 설명합니다. 이러한 문제는 데이터를 사용자에게 친숙한 형식으로 표시해야 할 때, 특히 동적으로 생성된 각 열에 값 개수가 필요할 때 발생합니다.

문제 설명

Customers, CustomerRewards, Rewards라는 세 개의 테이블이 있습니다. 목표는 각 고객의 이름과 각 보상 유형(예: 브론즈, 실버, 골드 등)에서 보유한 보상 수를 표시하는 새 테이블을 생성하는 것입니다. 그러나 보상 유형은 동적이므로 시간이 지남에 따라 새로운 유형이 추가되거나 제거될 수 있습니다.

해결책: PIVOT 기능을 사용하세요

정적 피벗:

리워드 유형의 개수를 미리 알고 있다면 하드코딩된 PIVOT 기능을 사용할 수 있습니다. 예:

<code class="language-sql">select name, [Bronze], [Silver], [Gold], [Platinum], [AnotherOne]
from
(
  select c.name,
    cr.description,
    r.typeid
  from customers c
  left join rewards r
    on c.id = r.customerid
  left join customerrewards cr
    on r.typeid = cr.typeid
) x
pivot
(
  count(typeid)
  for description in ([Bronze], [Silver], [Gold], [Platinum], [AnotherOne])
) p;</code>
로그인 후 복사

동적 피벗:

보상 유형의 수가 다를 수 있는 경우 동적 SQL을 사용하여 PIVOT을 수행할 수 있습니다.

<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 c
                left join rewards r
                  on c.id = r.customerid
                left join customerrewards cr
                  on r.typeid = cr.typeid
            ) x
            pivot
            (
                count(typeid)
                for description in (' + @cols + ')
            ) p '

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

전체 열 포함

전체 열을 포함하려면 ROLLUP을 사용할 수 있습니다.

정적 롤업:

<code class="language-sql">select name, sum([Bronze]) Bronze, sum([Silver]) Silver,
  sum([Gold]) Gold, sum([Platinum]) Platinum, sum([AnotherOne]) AnotherOne
from
(
  select name, [Bronze], [Silver], [Gold], [Platinum], [AnotherOne]
  from
  (
    select c.name,
      cr.description,
      r.typeid
    from customers c
    left join rewards r
      on c.id = r.customerid
    left join customerrewards cr
      on r.typeid = cr.typeid
  ) x
  pivot
  (
    count(typeid)
    for description in ([Bronze], [Silver], [Gold], [Platinum], [AnotherOne])
  ) p
) x
group by name with rollup</code>
로그인 후 복사

동적 롤업:

<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX),
    @colsRollup 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,'')

select @colsRollup
      = STUFF((SELECT ', Sum(' + QUOTENAME(description) + ') as ' + QUOTENAME(description)
                    from customerrewards
                    group by description, typeid
                    order by typeid
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,1,'')


set @query
          = 'SELECT name, ' + @colsRollup + '
             FROM
             (
                SELECT name,' + @cols + ' from
                 (
                    select c.name,
                      cr.description,
                      r.typeid
                    from customers c
                    left join rewards r
                      on c.id = r.customerid
                    left join customerrewards cr
                      on r.typeid = cr.typeid
                ) x
                pivot
                (
                    count(typeid)
                    for description in (' + @cols + ')
                ) p
              ) x1
              GROUP BY name with ROLLUP'

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

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

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