2011-01-20 10 views
-1

私はprojectIdsのCSV文字列を受け取り、次の結果セットを返すストアドプロシージャを生成しようとしています。SQL Server 2005結果セットを取得するためにタブデータをピボットまたはクロスする方法

alt text

sample data

フィールドの残りの部分は、プロジェクトごとにマイルストーンのピボットをさかのぼりながらPROJECTIDと名前のフィールドは、プロジェクトテーブルから来ます。マイルストーンフィールドは、それぞれのマイルストーンがExcelファイルの名前として表示されるようにする(37,39,41,45,47,50,53,72,73,75,77)CIDのマイルストーンに関するものですそれぞれのマイルストーン名を別名で表示したいと思っています)

また、最初のマイルストーンフィールドはBRS(cid = 37)の開始日で、残りのマイルストーンフィールドはすべての終了日にマイルストーンCID 37と上記の残りの部分が含まれます。

日付は、利用可能なデータがあるprojectMilestoneの日付を表す必要があります。特定のCIDのprojectMilestoneがない場合は、ReleaseScheduleの日付を使用する必要があります。私はCOALESCE(projectmilestone dates、releaseschedual dates)に行き、これを達成しました。マイルストーン名の

フィールドヘッダーには、次のようになります。あなたは完全にあなたが望むすべてを自動化することができ

CID   NAME in result set (as field headers) 
37   BRS 
39   SRS 
41   SAD 
45   Product Profile Review 
47   SE Integration 
50   IDE 
53   UAT 
72   PE Testing 
73   Code Freeze 
75   Dark Pod 
77   Production 
+0

プロジェクトのマイルストーンの構造は何テーブルを日付の変更は可能ですか? – Thomas

+0

より具体的には、リリーススケジュールの日付はどこから来ますか? – Thomas

+1

構造がExcelファイルにあります。日付はすべて、BRSの開始日を除いて同じ論理ですが、最初のマイルストーンの開始日を使用し、残りは終了日を使用する、このコアレス(projectmilestone.endDate、releaseschedual.endDate)のような@Thomasのようなものです。 – kacalapy

答えて

0

@beth私は以下のコードを使って個々のprojecttIdのためにこれを動作させました。代わりにピボットを使用しての私は、最後にデータをピボットするには、手動case文を持っている:

ALTER PROCEDURE [dbo].[rpt_ReportingMilestones] 
(@ProjectId int = null) 
AS 
BEGIN 
    SELECT sco.CID, 
      sco.CodeName, 
      t1.EndDate as rsEndDate, 
      t2.EndDate as pmEndDate, 
    t2.CodeName as RAGStatus 
     INTO #TTT 
     FROM StatusCode sco 
     LEFT OUTER JOIN 
      (SELECT sc.CID, 
        rs.EndDate 
       FROM StatusCode sc 
      INNER JOIN ReleaseSchedule rs 
       ON sc.CID = rs.MilestoneCID 
      INNER JOIN Project p 
       ON rs.ReleaseID = p.ReleaseID 
       AND p.ProjectId = @ProjectId) as t1 
     ON sco.CID = t1.CID 
     LEFT OUTER JOIN 
      (SELECT sc.CID, 
        pm.EndDate, 
     sc2.CodeName 
       FROM StatusCode sc 
      INNER JOIN ProjectMilestone pm 
       ON sc.CID = pm.MilestoneCID 
       AND pm.ProjectID = @ProjectId 
    INNER JOIN StatusCode sc2 
     ON pm.RAGStatusCID = sc2.CID) as t2 
     ON sco.CID = t2.CID 
    WHERE sco.CID in (37, 39, 41, 45, 47, 50, 53, 72, 73, 75, 77) 

CREATE TABLE #UUU 
      (rowid integer not null, 
      rowHeader nvarchar(50), 
      milestone1 DateTime, 
    ragstatus1 nvarchar(50), 
      milestone2 DateTime, 
    ragstatus2 nvarchar(50), 
      milestone3 DateTime, 
    ragstatus3 nvarchar(50), 
      milestone4 DateTime, 
    ragstatus4 nvarchar(50), 
      milestone5 DateTime, 
    ragstatus5 nvarchar(50), 
      milestone6 DateTime, 
    ragstatus6 nvarchar(50), 
      milestone7 DateTime, 
    ragstatus7 nvarchar(50), 
      milestone8 DateTime, 
    ragstatus8 nvarchar(50), 
      milestone9 DateTime, 
    ragstatus9 nvarchar(50), 
      milestone10 DateTime, 
    ragstatus10 nvarchar(50), 
      milestone11 DateTime, 
    ragstatus11 nvarchar(50)) 


    INSERT INTO #UUU 
SELECT 2 as RowId, 
      'Baseline' as rowHeader, 
      CASE WHEN CID = 37 THEN rsEndDate ELSE null END as Milestone1, 
      null, 
      CASE WHEN CID = 39 THEN rsEndDate ELSE null END as Milestone2, 
      null, 
      CASE WHEN CID = 41 THEN rsEndDate ELSE null END as Milestone3, 
      null, 
      CASE WHEN CID = 45 THEN rsEndDate ELSE null END as Milestone4, 
      null, 
      CASE WHEN CID = 47 THEN rsEndDate ELSE null END as Milestone5, 
      null, 
      CASE WHEN CID = 50 THEN rsEndDate ELSE null END as Milestone6, 
      null, 
      CASE WHEN CID = 53 THEN rsEndDate ELSE null END as Milestone7, 
      null, 
      CASE WHEN CID = 72 THEN rsEndDate ELSE null END as Milestone8, 
      null, 
      CASE WHEN CID = 73 THEN rsEndDate ELSE null END as Milestone9, 
      null, 
      CASE WHEN CID = 75 THEN rsEndDate ELSE null END as Milestone10, 
      null, 
      CASE WHEN CID = 77 THEN rsEndDate ELSE null END as Milestone11, 
      null 
     FROM #TTT 


    INSERT INTO #UUU 
SELECT 3 as RowId, 
      'Adjusted', 
      CASE WHEN CID = 37 THEN pmEndDate ELSE null END as Milestone1, 
      CASE WHEN CID = 37 THEN RAGStatus ELSE null END as RAGStatus1, 
      CASE WHEN CID = 39 THEN pmEndDate ELSE null END as Milestone2, 
      CASE WHEN CID = 39 THEN RAGStatus ELSE null END as RAGStatus2, 
      CASE WHEN CID = 41 THEN pmEndDate ELSE null END as Milestone3, 
      CASE WHEN CID = 41 THEN RAGStatus ELSE null END as RAGStatus3, 
      CASE WHEN CID = 45 THEN pmEndDate ELSE null END as Milestone4, 
      CASE WHEN CID = 45 THEN RAGStatus ELSE null END as RAGStatus4, 
      CASE WHEN CID = 47 THEN pmEndDate ELSE null END as Milestone5, 
      CASE WHEN CID = 47 THEN RAGStatus ELSE null END as RAGStatus5, 
      CASE WHEN CID = 50 THEN pmEndDate ELSE null END as Milestone6, 
      CASE WHEN CID = 50 THEN RAGStatus ELSE null END as RAGStatus6, 
      CASE WHEN CID = 53 THEN pmEndDate ELSE null END as Milestone7, 
      CASE WHEN CID = 53 THEN RAGStatus ELSE null END as RAGStatus7, 
      CASE WHEN CID = 72 THEN pmEndDate ELSE null END as Milestone8, 
      CASE WHEN CID = 72 THEN RAGStatus ELSE null END as RAGStatus8, 
      CASE WHEN CID = 73 THEN pmEndDate ELSE null END as Milestone9, 
      CASE WHEN CID = 73 THEN RAGStatus ELSE null END as RAGStatus9, 
      CASE WHEN CID = 75 THEN pmEndDate ELSE null END as Milestone10, 
      CASE WHEN CID = 75 THEN RAGStatus ELSE null END as RAGStatus10, 
      CASE WHEN CID = 77 THEN pmEndDate ELSE null END as Milestone11, 
      CASE WHEN CID = 77 THEN RAGStatus ELSE null END as RAGStatus11 
     FROM #TTT 

    SELECT Rowid, 
      rowHeader, 
      MAX(Milestone1) AS 'BRS', 
    MAX(RagStatus1) AS 'BRS RAG', 
      MAX(Milestone2) AS 'SRS', 
    MAX(RagStatus2) AS 'SRS RAG', 
      MAX(Milestone3) AS 'SAD', 
    MAX(RagStatus3) AS 'SAD RAG', 
      MAX(Milestone4) AS 'Product Profile Review', 
    MAX(RagStatus4) AS 'Product Profile Review RAG', 
      MAX(Milestone5) AS 'SE Integration', 
    MAX(RagStatus5) AS 'SE Integration RAG', 
      MAX(Milestone6) AS 'IDE', 
    MAX(RagStatus6) AS 'IDE RAG', 
      MAX(Milestone7) AS 'UAT', 
    MAX(RagStatus7) AS 'UAT RAG', 
      MAX(Milestone8) AS 'PE Testing', 
    MAX(RagStatus8) AS 'PE Testing RAG', 
      MAX(Milestone9) AS 'Code Freeze', 
    MAX(RagStatus9) AS 'Code Freeze RAG', 
      MAX(Milestone10) AS 'Dark Pod', 
    MAX(RagStatus10) AS 'Dark Pod RAG', 
      MAX(Milestone11) AS 'Production', 
    MAX(RagStatus11) AS 'Production RAG' 
     FROM #UUU 
    GROUP BY Rowid, rowHeader 
    ORDER BY RowId 
END 
-1

わからない場合。

再:私は、それぞれのマイルストーンが

(私はそれはのように表示したいものを、それぞれが、各マイルストーン名を変換するためにエイリアスを使用するように推測しています)Excelファイル内の名前として表示させたいですルックアップテーブルを使用できますか?

再:BRS(CID = 37)の開始日およびマイルストーンフィールドの残りの部分は、すべてのエンドピボット前

をさかのぼりされているまた、最初のマイルストーンフィールドを注意し、これらのフィールドは、でなければならないだろう同等の出力列。ピボット時には、first()、min()、max()などの集計関数を値に適用する必要があります。

re:日付は、利用可能なデータがあるprojectMilestoneの日付を表す必要があります。特定のCIDのprojectMilestoneがない場合は、ReleaseScheduleの日付を使用する必要があります。

また、ピボットの前にこの作業を行う必要があります。

あなたはアンピボット結果はあなたがprojectMilestoneとreleaseScheduleでプロジェクトに参加(projectMilestoneのギャップの場合のみ)、あなたが表示したいあなたの列のヘッダー名を検索したいように設定できますか?

関連する問題