2008-10-01 33 views
12

Tôi có một cơ sở dữ liệu theo định dạng sau:Pivot Table và CONCATENATE Cột

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 

Tôi có thể sử dụng SQL để chuyển đổi nó vào đây:

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

Vì vậy, TYPE, SUBTYPE được nối vào các cột mới và COUNT được tổng hợp trong đó các trận đấu IDMONTH.

Mọi mẹo sẽ được đánh giá cao. Điều này có thể trong SQL hay tôi nên lập trình nó theo cách thủ công?

Cơ sở dữ liệu là SQL Server 2005.

Giả sử có 100s của TYPESSUBTYPES như vậy và 'A' và 'Z' không nên được mã hóa cứng nhưng tạo ra tự động.

Trả lời

28

SQL Server 2005 cung cấp một PIVOT và UNPIVOT điều hành rất hữu ích cho phép bạn thực hiện bảo trì miễn phí mã này sử dụng PIVOT và một số hệ mã/động 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) 
+0

nhờ bạn đã lưu của tôi ngày! – TheVillageIdiot

6
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 

Bạn thay đổi yêu cầu nhiều hơn nhóm tiếp thị của chúng tôi! Nếu bạn muốn nó được năng động, bạn sẽ cần phải quay trở lại trên một sproc.

+3

+1 cho tbl_why_would_u_do_this –

Các vấn đề liên quan