جدول المحورية والأعمدة سلسل
-
03-07-2019 - |
سؤال
ولدي قاعدة بيانات في الشكل التالي:
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.
لا تنتمي إلى StackOverflow