0

皆様の休日と楽しい時間をお楽しみください。機会があれば、これに返信してください。

SQL Server 2005 を使用しています。

問題は、私たちのチームの 1 つに、一連のイベント/アクションで物事を行うプロセスがあることです。ほとんどの場合、シーケンスごとに 4 つのアクション/イベントです。これらのイベントは修正されています。この DWH を実行すると、各イベントのエントリが個別の行として取得されます。

例 1) 顧客に電話する 2) 保険を販売する 3) PDS を送信する 4) 製品チームに詳細を送信する

すべてのアクションとその定義が Dimension_Point_Code テーブルにあるように設定しました。DWH からのすべてのイベントは Fact として扱われ、Fact_Point に格納されます。

ここでのポイントとは、一連のプロセスにおけるポイントを指します。

したがって、この情報を格納するテーブルは次のようになります

寸法表

CREATE TABLE [tbl_Dim_Point_Code]
(
[Point_Code_Key] [int] IDENTITY(101,1) NOT NULL,
[Point_Code] [varchar](8) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Point_Code_TouchPoint] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]

ファクト テーブル

CREATE TABLE [tbl_FACT_Point]
(
[Point_Key] [bigint] IDENTITY(100,1) NOT NULL,
[Point_Code_Key] [int] NOT NULL,
[Customer_Number] [varchar](19) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[Sale_Date] [datetime] NULL,
[Rep_ID] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]

ディメンション内のデータ

INSERT INTO [tbl_Dim_Point_Code]
       ([Point_Code]
       ,[Point_Code_TouchPoint])

Select 'CALC' as Point_Code,'Point1' as Point_Code_TouchPoint
UNION
Select 'SELL' as Point_Code,'Point2' as Point_Code_TouchPoint
UNION
Select 'SPDS' as Point_Code,'Point3' as Point_Code_TouchPoint
UNION
Select 'TPRD' as Point_Code,'Point4' as Point_Code_TouchPoint

実際のデータ

INSERT INTO [tbl_FACT_Point]
       ([Point_Code_Key]
       ,[Customer_Number]
       ,[Sale_Date]
       ,[Rep_ID])
Select 101,'C101501','24-Feb-2012','ABC'
UNION
Select 102,'C101501','24-Feb-2012','ABC'
UNION
Select 103,'C101501','26-Feb-2012','DEF'
UNION
Select 104,'C101501','27-Feb-2012','XYZ'
UNION
Select 101,'C101502','2-Feb-2012','GHI'
UNION
Select 102,'C101502','2-Feb-2012','GHI'
UNION
Select 104,'C101502','4-Feb-2012','XYZ'
UNION
Select 101,'C101503','14-Feb-2012','ABC'
UNION
Select 103,'C101503','20-Feb-2012','ABC'
UNION
Select 104,'C101503','22-Feb-2012','BBC'
UNION
Select 101,'C101501','24-Oct-2012','ABC'
UNION
Select 102,'C101501','24-Oct-2012','ABC'
UNION
Select 103,'C101501','26-Oct-2012','DEF'
UNION
Select 104,'C101501','27-Oct-2012','XYZ'

注意点 1) ご覧のとおり、顧客 C101501 は 2 回電話して販売されました。2) そして、チーム、DWH、SQL Server プロセスなど、関連するすべての処理が毎日行われます。したがって、ほとんどの場合、何が起こるかわかりません。イベント 1 が発生したことだけがわかります。それから数日後、イベント 2 など。3) 101 & 104 は必須イベントです。102 と 103 は発生する場合と発生しない場合があります。販売の有無にかかわらず、チームは製品チームに連絡します。

今 - 私たちが望むのは、エントリがこのテーブルに転置されることです

CREATE TABLE [tbl_Process1_EVENT]
(
[HS_EVENT_KEY] [int] IDENTITY(101,1) NOT NULL,
[Customer_Number] [varchar](19) ,
[Import_Date] [datetime] NULL,
[Point1_Date_Called] [datetime] NULL,
[Point1_PointCode] [varchar](8) ,
[Point1_Rep_Id] [varchar](50) ,
[Point2_Date_Sold] [datetime] NULL,
[Point2_PointCode] [varchar](8) ,
[Point2_Rep_Id] [varchar](50) ,
[Point3_Date_PDSSent] [datetime] NULL,
[Point3_PointCode] [varchar](8) ,
[Point3_Rep_Id] [varchar](50) ,
[Point4_Date_ProdTeamXfer] [datetime] NULL,
[Point4_PointCode] [varchar](8) ,
[Point4_Rep_Id] [varchar](50) 
) ON [PRIMARY]

私がしたいのは、このような出力です。

Customer_Number Import_Date Point1_Date_Called  Point1_PointCode    Point1_Rep_Id   Point2_Date_Sold    Point2_PointCode    Point2_Rep_Id   Point3_Date_PDSSent Point3_PointCode    Point3_Rep_Id   Point4_Date_ProdTeamXfer    Point4_PointCode    Point4_Rep_Id
C101501         28/02/2012  24/02/2012          CALC                ABC             24/02/2012          SELL                ABC             26/02/2012          SPDS                DEF             27/02/2012                  TPRD                XYZ
C101502         3/02/2012   2/02/2012           CALC                GHI             2/02/2012           SELL                GHI             NULL                NULL                NULL            4/02/2012                   TPRD                ABC
C101503         23/02/2012  14/02/2012          CALC                ABC             NULL                NULL                NULL            20/02/2012          SPDS                ABC             22/02/2012                  TPRD                BBC
C101501         28/10/2012  24/10/2012          CALC                ABC             24/10/2012          SELL                ABC             26/10/2012          SPDS                DEF             27/10/2012                  TPRD                XYZ

同じ顧客に対して新しい販売が行われた場合、C101501 の新しいエントリを含む行にデータを転置します。Import_date は、行が更新された日付です。私が言ったように、処理は毎日行われます。

したがって、この出力の 1 行目の表を詳しく説明できれば、

2012 年 2 月 24 日にイベント CALC が発生します。これについては、2012 年 2 月 25 日にわかっています。25/02 のポイント 1 とポイント 2 はデータで満たされ、ポイント 3 とポイント 4 は空になります。Import_Date - 2012 年 2 月 25 日になります

2012 年 2 月 26 日、ポイント 3 である PDS が送信されます。したがって、同じ行が更新されます。ポイント3のみの更新となります。Import_date は 2012 年 2 月 27 日になります

2012/02/27 ポイント 4 イベントが発生します。したがって、2012 年 2 月 28 日に同じ行がポイント 4 の詳細で更新されます。

この問題について私が考えることができるのはそれだけです。

いつでも助けてください。

楽しい休日をお過ごしください。

PS: 出力の形式に問題がある可能性があります。私はそれをより良くすることができますアドバイスしてください。

4

1 に答える 1

0

ピボット コマンド (別名クロス タブ) を使用する必要があると思います。頭を動かすのは簡単ではありません:

次のリンクが役立つはずです/役立つ可能性があります:

http://geekswithblogs.net/lorint/archive/2006/08/04/87166.aspx

http://msdn.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx

http://www.mssqltips.com/sqlservertip/1019/crosstab-queries-using-pivot-in-sql-server/

http://www.simple-talk.com/blogs/2007/09/14/pivots-with-dynamic-columns-in-sql-server-2005/

良いルッチ

于 2012-12-24T14:09:48.790 に答える