Динамический столбец SQL Server всех дней месяца и вывод отчета - PullRequest
0 голосов
/ 05 января 2011

У меня есть хранимая процедура, которую я использую для отчетов asp.net, и она принимает 3 параметра.

  1. Название месяца,
  2. год
  3. ID филиала

Вот процедура

ALTER PROCEDURE [dbo].[Report_TabularWholeMonth]   
 @MonthName varchar(20),  
  @Year varchar(20),  
  @Branch_ID integer  
    AS  
  BEGIN  

    IF 1=0 BEGIN  
       SET FMTONLY OFF  
  END  

  --      Parameters and presets
  --===== This would be the parameter for a stored procedure
 DECLARE @pDesiredMonth DATETIME ;
 SELECT @pDesiredMonth =@MonthName + space(1)+ @Year --'December 2010';

 --===== These are some working variables.  Their names tell what they do.
 DECLARE @MonthStart     DATETIME,
      @NextMonthStart DATETIME,
       @Days           INT,
       @SQL            VARCHAR(MAX)
;
 SELECT @MonthStart     = DATEADD(mm,DATEDIFF(mm,'1753',@pDesiredMonth),'1753'),
      @NextMonthStart = DATEADD(mm,1,@MonthStart),
       @Days           = DATEDIFF(dd,@MonthStart,@NextMonthStart)
 ;

SELECT DesiredDay  = N,
     DesiredDate = DATEADD(dd,t.N-1,@MonthStart)
    INTO #DesiredDates
 FROM dbo.Tally t
 WHERE N BETWEEN 1 AND @Days
  ;
  -- This pre-aggregates the data and, yeah, it uses an index seek to do so.
  -- It's just easier than joining the dates above with a million row table and the "  reflection" in a CTE
  -- will still cause that join to happen.  Instead, we used "Divide'n'Conquer" on this.
  SELECT VTRCheckList.CLid, CLName,
           TheDay      = DAY(vtrRespDate),
           Total_Count = SUM(Cast(VtrValue as Int))
           INTO #PreAggregation
       FROM VTRCheckListDetails 
        INNER JOIN VTRCheckList on VTRCheckListDetails.CLid=  VTRCheckList.CLid
       WHERE vtrRespDate   >= @MonthStart
      AND vtrRespDate    < @NextMonthStart 
      AND branchid = @Branch_ID
      GROUP BY VTRCheckList.CLid , CLName,vtrRespDate
     ;
    -- This creates the "Task_ID" portion of the report query.
    -- READ about "GROUP BY WITH CUBE" to learn what "GROUPING" does for WITH ROLLUP and WITH CUBE.
            SELECT @SQL = 'SELECT CLName = CASE WHEN GROUPING(CLName) = 1 THEN SPACE(5)+''Total'' ELSE CLName END,'

           SELECT @SQL = @SQL + CHAR(10)
            + 'SUM(CASE WHEN date.DesiredDay = ' + CAST(t.DesiredDay AS VARCHAR(2))

        -- + ' THEN preagg.Total_Count ELSE 0 END) AS ''' + CASE WHEN   DATEDIFF(dd,0,t.DesiredDate)%7 = 6 THEN ' SomeValue' ELSE    CONVERT(CHAR(6),t.DesiredDate,13) END+''','               
         + ' THEN preagg.Total_Count ELSE 0 END) AS ''' +  CONVERT(CHAR(6),t.DesiredDate,13)+ CASE WHEN DATEDIFF(dd,0,t.DesiredDate)%7 = 6 THEN   '(Sun)' ELSE '' END+''','  
          FROM #DesiredDates t  
;
    --===== This creates the total for each Task_ID and finishes up the query with criteria, grouping, etc, etc.
     SELECT @SQL = @SQL + ' Total = SUM(Total_Count)
    FROM #DesiredDates date
  LEFT JOIN #PreAggregation preagg
    ON date.DesiredDay = preagg.TheDay
 WHERE preagg.CLid > 0 
  GROUP BY preagg.CLName --WITH ROLLUP --READ ABOUT GROUP BY, WITH ROLLUP, and WITH    CUBE (for "GROUPING")  
 ORDER BY CLName  
 ;
'
;
;
EXEC(@SQL)
END

Моя проблема в том, что он генерирует окончательный SQL, который заполняет данные в соответствии с днями месяца и столбцами сборки. В отчете asp.net для создания DataSet мне нужно выбрать столбцы на основе оператора select.

Но в DataSet он извлекает только два столбца CLName и TOTAL.

Как преодолеть эту проблему, так как в этом отчете будет работать так много пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...