문제
다음 형식의 데이터베이스가 있습니다.
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에서 떨어져야합니다.
제휴하지 않습니다 StackOverflow