سؤال

ولدي قاعدة بيانات في الشكل التالي:

 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 خادم 2005.

وافترض هناك 100s من TYPES وSUBTYPES جدا و'A' و 'Z' لا ينبغي أن تكون مشفرة ولكن من الصعب ديناميكيا.

هل كانت مفيدة؟

المحلول

يقدم

وSQL خادم 2005 مفيد جدا PIVOT وUNPIVOT مشغل والتي تسمح لك لجعل هذا الرمز صيانة خالية من استخدام PIVOT وبعض رمز جيل / الديناميكي 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