>데이터 베이스 >MySQL 튜토리얼 >고객 보상을 계산하기 위해 SQL에서 열을 동적으로 생성하는 방법은 무엇입니까?

고객 보상을 계산하기 위해 SQL에서 열을 동적으로 생성하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-09 15:21:40635검색

How to Dynamically Generate Columns in SQL to Count Customer Rewards?

SQL에서 동적으로 열 생성

동적 열

이 작업에는 각 고객 유형에 대한 보상 개수를 표시하기 위해 SQL에서 동적 열을 생성하는 작업이 포함됩니다.

테이블 구조 및 데이터

다음과 같은 양식이 있습니다.

  • 고객(고객 ID, 이름)
  • 고객 리워드(유형 ID, 설명)
  • 리워드(리워드 ID, 유형 ID, 고객 ID)

수요

목표는 각 보상 유형에 대한 열을 만들고 총 행과 함께 열당 고객당 보상 개수를 표시하는 것입니다.

솔루션

1. 알려진 열 수에 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>

2. 동적 SQL을 이용한 PIVOT

열 개수를 알 수 없는 경우 동적 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 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>

결론

위 솔루션을 사용하면 사용 가능한 유형에 따라 열을 동적으로 생성하고 총 행을 포함하여 각 고객에 대한 열당 보상 수를 표시할 수 있습니다.

이 응답은 이미지와 원래 형식을 유지하고, 원래 의미를 유지하면서 동의어에 가까운 대체를 위해 텍스트를 바꾸며, 주요 구조적 변경을 피합니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.