ひねりを加えたSQLピボットの質問、次の表を見てください(年と月は別々であることに注意してください)。
CREATE TABLE [dbo].[tbl_BranchTargets]
(
[BranchID] [varchar](4) NOT NULL ,
[Year] [smallint] NOT NULL ,
[Month] [smallint] NOT NULL ,
[Target] [int] NULL ,
CONSTRAINT [PK_tbl_BranchTargets] PRIMARY KEY CLUSTERED ( [BranchID] ASC, [Year] ASC, [Month] ASC ) WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
)
ON [PRIMARY]
および次のダミーデータ:
INSERT [dbo].[tbl_BranchTargets] ([BranchID], [Year], [Month], [Target]) VALUES (N'001', 2012, 4, 1)
INSERT [dbo].[tbl_BranchTargets] ([BranchID], [Year], [Month], [Target]) VALUES (N'001', 2012, 5, 117)
INSERT [dbo].[tbl_BranchTargets] ([BranchID], [Year], [Month], [Target]) VALUES (N'001', 2012, 6, 233)
INSERT [dbo].[tbl_BranchTargets] ([BranchID], [Year], [Month], [Target]) VALUES (N'001', 2012, 7, 386)
INSERT [dbo].[tbl_BranchTargets] ([BranchID], [Year], [Month], [Target]) VALUES (N'003', 2012, 4, 2)
INSERT [dbo].[tbl_BranchTargets] ([BranchID], [Year], [Month], [Target]) VALUES (N'003', 2012, 6, 234)
INSERT [dbo].[tbl_BranchTargets] ([BranchID], [Year], [Month], [Target]) VALUES (N'003', 2012, 7, 387)
与えられたダミーデータを次のようにモデル化するにはどうすればよいですか(年と月のキー列がマージされてYYYYMMを形成することに注意してください)。
これに:
5月にブランチ3のエントリが欠落していることに注意してください。これは、nullとして処理する必要があります。たとえば、12か月のうち、ブランチにはそのうちの1つのターゲットしかない可能性があるため、他のすべての月はnullである必要があります。
PIVOT()と不格好なカーソルオプションを調べましたが、これを行うための簡単なベストプラクティスの方法を見つけるのに苦労しています。動的なSQL + PIVOT()を実装する必要があると思いますが、頭を悩ませることはできません。それを丸めます。
動的ピボットの場合、最初に列名を特定することを知っています(私は思う)、これは次のように行うことができます:
DECLARE @Columns AS NVARCHAR(MAX);
DECLARE @StrSQL AS NVARCHAR(MAX);
SET @Columns = STUFF((SELECT DISTINCT
',' + QUOTENAME(CONVERT(VARCHAR, c.YEAR) + RIGHT('00' + CONVERT(VARCHAR, c.MONTH), 2))
FROM tbl_BranchTargets c
FOR XML PATH('') ,
TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
しかし、ピボットを実行する方法は私を少し超えています(基本的にキー列にマージして最終列を作成しているため)-YYYY + MMが1列の値として定義されているピボットを試行する前に、データをマージする必要がありますか? ?
(SQL Server 2008 R2を使用しています)