문제

다음 형식의 데이터베이스가 있습니다.

 ID    TYPE   SUBTYPE    COUNT   MONTH
 1      A      Z          1       7/1/2008
 1      A      Z          3       7/1/2008
 2      B      C          2       7/2/2008
 1      A      Z          3       7/2/2008

SQL을 사용하여 다음으로 변환 할 수 있습니까?

ID    A_Z   B_C   MONTH
1     4     0     7/1/2008
2     0     2     7/2/2008
1     0     3     7/2/2008

그래서 TYPE, SUBTYPE 새로운 열에 연결됩니다 COUNT 위치에 요약된다 ID 그리고 MONTH 성냥.

모든 팁에 감사드립니다. SQL에서 가능합니까 아니면 수동으로 프로그래밍해야합니까?

데이터베이스는 SQL Server 2005입니다.

100 대가 있다고 가정하십시오 TYPES 그리고 SUBTYPES 따라서 'A'와 'Z'는 하드 코딩되지 않지만 동적으로 생성되어야합니다.

도움이 되었습니까?

해결책

SQL Server 2005는 피벗 및 일부 코드 생성/동적 SQL을 사용 하여이 코드를 유지 보수없이 만들 수있는 매우 유용한 피벗 및 비바운드 연산자를 제공합니다.

/*
CREATE TABLE [dbo].[stackoverflow_159456](
    [ID] [int] NOT NULL,
    [TYPE] [char](1) NOT NULL,
    [SUBTYPE] [char](1) NOT NULL,
    [COUNT] [int] NOT NULL,
    [MONTH] [datetime] NOT NULL
) ON [PRIMARY]
*/

DECLARE @sql AS varchar(max)
DECLARE @pivot_list AS varchar(max) -- Leave NULL for COALESCE technique
DECLARE @select_list AS varchar(max) -- Leave NULL for COALESCE technique

SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + PIVOT_CODE + ']'
        ,@select_list = COALESCE(@select_list + ', ', '') + 'ISNULL([' + PIVOT_CODE + '], 0) AS [' + PIVOT_CODE + ']'
FROM (
    SELECT DISTINCT [TYPE] + '_' + SUBTYPE AS PIVOT_CODE
    FROM stackoverflow_159456
) AS PIVOT_CODES

SET @sql = '
;WITH p AS (
    SELECT ID, [MONTH], [TYPE] + ''_'' + SUBTYPE AS PIVOT_CODE, SUM([COUNT]) AS [COUNT]
    FROM stackoverflow_159456
    GROUP BY ID, [MONTH], [TYPE] + ''_'' + SUBTYPE
)
SELECT ID, [MONTH], ' + @select_list + '
FROM p
PIVOT (
    SUM([COUNT])
    FOR PIVOT_CODE IN (
        ' + @pivot_list + '
    )
) AS pvt
'

EXEC (@sql)

다른 팁

select id,
sum(case when type = 'A' and subtype = 'Z' then [count] else 0 end) as A_Z,
sum(case when type = 'B' and subtype = 'C' then [count] else 0 end) as B_C,
month
from tbl_why_would_u_do_this
group by id, month

마케팅 팀보다 요구 사항을 더 변경합니다! 역동적이되기를 원한다면 Sproc에서 떨어져야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top