【问题标题】:help adding a field to my sql proc result帮助在我的 sql proc 结果中添加一个字段
【发布时间】:2011-01-21 17:15:35
【问题描述】:

我有下面的 SQL 过程,我正在尝试将 SRS 开始日期字段添加到下面的过程的结果集中。我想为 SRS_StartDate 添加一个字段。该字段应定义为:coalesce(projectMilestone.startDate, releaseschedual.startDate) as SRS_StartDate - 但仅适用于 CID=37,因为这是 SRS 的 cid

我在下面附上了我当前 proc 和 a file of table structure and data as well 的示例 sql 代码。

您可以使用这些 projectID 进行测试,因为 excel 文件具有支持它们的数据。

exec rainbows '66,97,25'   --testing



create PROC rainbows
    @ProjectIDs NVARCHAR(1000)      
AS      

DECLARE @ProjIDs TABLE (id INT)     
INSERT @ProjIDs  SELECT DISTINCT value FROM fn_Split(@ProjectIDs, ',')    

--get core data set
SELECT t1.ProjectID,t1.ProjectName,
       case sco.CID when 37 then 'BRS Start'
                    when 37 then 'BRS end'
                    when 39 then 'SRS'
                    when 41 then 'SAD'
                    when 45 then 'Product Profile Review'
                    when 47 then 'SE Integration'
                    when 50 then 'IDE'
                    when 53 then 'UAT'
                    when 72 then 'PE Testing'
                    when 73 then 'Code Freeze'
                    when 75 then 'Dark Pod'
                    when 77 then 'Production' end CID, 
       coalesce(t2.EndDate, t1.EndDate) MilestoneEndDate 
INTO #DATA    
FROM StatusCode sco    
      LEFT OUTER JOIN    
           (SELECT p.ProjectId,p.ProjectName,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 
             INNER JOIN @ProjIDs pList ON p.ProjectId = pList.id
            ) AS t1 ON sco.CID = t1.CID    
      LEFT OUTER JOIN    
           (SELECT sc.CID, pm.EndDate
              FROM StatusCode sc    
             INNER JOIN ProjectMilestone pm ON sc.CID = pm.MilestoneCID 
             INNER JOIN @ProjIDs pList ON pm.ProjectId = pList.id
            ) AS t2 ON sco.CID = t2.CID   
WHERE sco.CID IN (37, 39, 41, 45, 47, 50, 53, 72, 73, 75, 77)    

select ProjectID,ProjectName,[BRS start],[BRS Start] [BRS end],[SRS],[SAD],[Product Profile Review],[SE Integration],[IDE],[UAT],
                                         [PE Testing],[Code Freeze],[Dark Pod],[Production]
 from (
SELECT * FROM  #DATA
PIVOT (MAX(MilestoneEndDate) FOR CID IN ([BRS start],[BRS end],[SRS],[SAD],[Product Profile Review],[SE Integration],[IDE],[UAT],
                                         [PE Testing],[Code Freeze],[Dark Pod],[Production]
)) AS P) t1

【问题讨论】:

    标签: sql-server sql-server-2005 pivot


    【解决方案1】:
    create PROC rainbows
        @ProjectIDs NVARCHAR(1000)      
    AS      
    
    DECLARE @ProjIDs TABLE (id INT)     
    INSERT @ProjIDs  SELECT DISTINCT value FROM fn_Split(@ProjectIDs, ',')    
    
    --get core data set
    SELECT t1.ProjectID,t1.ProjectName,
           case sco.CID when 37 then 'BRS Start'
                        when 37 then 'BRS end'
                        when 39 then 'SRS'
                        when 41 then 'SAD'
                        when 45 then 'Product Profile Review'
                        when 47 then 'SE Integration'
                        when 50 then 'IDE'
                        when 53 then 'UAT'
                        when 72 then 'PE Testing'
                        when 73 then 'Code Freeze'
                        when 75 then 'Dark Pod'
                        when 77 then 'Production' end CID, 
           coalesce(t2.EndDate, t1.EndDate) MilestoneEndDate ,
           CASE WHEN sco.CID=37 then coalesce(t2.startDate, t1.startDate) else null as SRS_StartDate
    INTO #DATA    
    FROM StatusCode sco    
          LEFT OUTER JOIN    
               (SELECT p.ProjectId,p.ProjectName,sc.CID,rs.EndDate, rs.startDate
                  FROM StatusCode sc    
                 INNER JOIN ReleaseSchedule rs ON sc.CID = rs.MilestoneCID    
                 INNER JOIN Project p  ON rs.ReleaseID = p.ReleaseID 
                 INNER JOIN @ProjIDs pList ON p.ProjectId = pList.id
                ) AS t1 ON sco.CID = t1.CID    
          LEFT OUTER JOIN    
               (SELECT sc.CID, pm.EndDate, pm.startDate
                  FROM StatusCode sc    
                 INNER JOIN ProjectMilestone pm ON sc.CID = pm.MilestoneCID 
                 INNER JOIN @ProjIDs pList ON pm.ProjectId = pList.id
                ) AS t2 ON sco.CID = t2.CID   
    WHERE sco.CID IN (37, 39, 41, 45, 47, 50, 53, 72, 73, 75, 77)    
    
    select ProjectID,ProjectName,SRS_StartDate,[BRS start],[BRS Start] [BRS end],[SRS],[SAD],[Product Profile Review],[SE Integration],[IDE],[UAT],
                                             [PE Testing],[Code Freeze],[Dark Pod],[Production]
     from (
    SELECT * FROM  #DATA
    PIVOT (MAX(MilestoneEndDate) FOR CID IN ([BRS start],[BRS end],[SRS],[SAD],[Product Profile Review],[SE Integration],[IDE],[UAT],
                                             [PE Testing],[Code Freeze],[Dark Pod],[Production]
    )) AS P) t1
    

    【讨论】:

    • 我在新行出现语法错误:CASE WHEN sco.CID=37 then coalesce(t2.startDate, t1.startDate) else null as SRS_StartDate
    • 另外,结果集不会返回与每个 projectId 相关的数据。所有里程碑的结束日期都是重复的。 projectid=25 int 测试数据的日期与其他数据不同,但 proc 的结果具有相同的所有日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多