Pivot-Tabellen und Spalten verketten
-
03-07-2019 - |
Frage
Ich habe eine Datenbank, in folgendem Format:
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
Kann ich SQL es in diese konvertieren:
ID A_Z B_C MONTH
1 4 0 7/1/2008
2 0 2 7/2/2008
1 0 3 7/2/2008
Also, die TYPE
, SUBTYPE
in neue Spalten verkettet und COUNT
summiert, wo das ID
und MONTH
Spiel.
Irgendwelche Tipps wäre sehr hilfreich. Ist das möglich in SQL oder soll ich programmiere es manuell?
Die Datenbank ist SQL Server 2005.
Angenommen, es gibt 100s von TYPES
und SUBTYPES
so und ‚A‘ und ‚Z‘ sollte nicht schwer, sondern dynamisch generierte codiert werden.
Lösung
SQL Server 2005 bietet eine sehr nützliche PIVOT und UNPIVOT Operator, können Sie diesen Code wartungsfrei machen PIVOT verwenden und einige Code-Generierung / dynamische 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)
Andere Tipps
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
Sie ändern Anforderungen mehr als unser Marketing-Team! Wenn Sie es dynamisch sein wollen Sie wieder auf einem sproc fallen müssen.