2011-12-08 24 views
2

在我朋友的幫助下,我可以找到這個複雜的查詢。如何修復此查詢以使其適用於ASP.NET應用程序?

DECLARE @LastSevenDays DATETIME, @Last30Days DATETIME 

SELECT @LastSevenDays = DATEADD(dd, -7, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)), 
     @Last30Days = DATEADD(dd, -30, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) 

SELECT [D].DivisionName 
,  COUNT(DISTINCT CASE WHEN DateTimeComplete >= @LastSevenDays THEN UQ.Username ELSE NULL END) AS ParticipantsLast7Days 
,  COUNT(DISTINCT CASE WHEN DateTimeComplete >= @LastSevenDays THEN UQ.QuizID ELSE NULL END) AS QuizzesLast7Days 
,  COUNT(DISTINCT UQ.Username) AS ParticipantsLast30Days 
,  COUNT(DISTINCT UQ.QuizID) AS QuizzesLast30Days 
,  COUNT(DISTINCT EM.UserName) AS TotalParticipantsInDivisions 
,  COUNT(DISTINCT EM.UserName) - COUNT(DISTINCT UQ.Username) [ParticipantsInDivisionsWithoutQuiz] 
FROM employee EM 
     INNER JOIN Divisions D 
     ON D.SapCode = EM.DivisionCode 
     LEFT OUTER JOIN [UserQuiz] AS UQ 
     ON UQ.UserName = EM.UserName 
      AND DateTimeComplete >= @Last30Days 
GROUP BY [D].[DivisionName] 

這個查詢會告訴我下面的:在上週和上個月的測驗參與者

  1. 總數
  2. 測驗上週採取上個月
  3. 總的總數每個部門的員工人數
  4. 未接受任何測驗的每個部門的員工總數

該查詢工作正常,但現在在網站中放置一個表並嘗試使用包含此查詢的SqlDataSource配置它以從數據庫中檢索信息後,它要求我確定兩個變量的參數:@LastSevenDays和@ Last30Days,我不知道我應該怎麼做。請幫忙嗎?

我知道也許我的問題看起來很簡單,但我嘗試了很多,失敗了。請幫我

回答

2

把它貼在存儲過程中,然後調用proc。

0

@LastSevenDays和@ Last30Days是您查詢使用的參數,因此SqlDataSource會請求它。

你可以做三件事情:

  • 創建一個存儲過程和call it(見它調用存儲過程中的第二個例子)
  • 取出參數並插入DATEADD功能無處不在,你通常引用的變量
  • 在您的SqlDataSource中使用FilterParameter並將其初始化爲代碼。
0

您可以在線變量和有一個標準的select語句,像這樣:

SELECT [D].DivisionName 
,  COUNT(DISTINCT CASE WHEN DateTimeComplete >= DATEADD(dd, -7, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) THEN UQ.Username ELSE NULL END) AS ParticipantsLast7Days 
,  COUNT(DISTINCT CASE WHEN DateTimeComplete >= DATEADD(dd, -7, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) THEN UQ.QuizID ELSE NULL END) AS QuizzesLast7Days 
,  COUNT(DISTINCT UQ.Username) AS ParticipantsLast30Days 
,  COUNT(DISTINCT UQ.QuizID) AS QuizzesLast30Days 
,  COUNT(DISTINCT EM.UserName) AS TotalParticipantsInDivisions 
,  COUNT(DISTINCT EM.UserName) - COUNT(DISTINCT UQ.Username) [ParticipantsInDivisionsWithoutQuiz] 
FROM employee EM 
     INNER JOIN Divisions D 
     ON D.SapCode = EM.DivisionCode 
     LEFT OUTER JOIN [UserQuiz] AS UQ 
     ON UQ.UserName = EM.UserName 
      AND DateTimeComplete >= DATEADD(dd, -30, DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)) 
GROUP BY [D].[DivisionName] 
0

在.NET代碼,寫這樣的方法:

 private DataTable doQuery(DateTime last7Days, DateTime last30Days) 
     { 
      DataTable result = new DataTable(); 

      string connectionString = "";//TODO; 

      string query = @" 
SELECT [D].DivisionName 
,  COUNT(DISTINCT CASE WHEN DateTimeComplete >= @LastSevenDays THEN UQ.Username ELSE NULL END) AS ParticipantsLast7Days 
,  COUNT(DISTINCT CASE WHEN DateTimeComplete >= @LastSevenDays THEN UQ.QuizID ELSE NULL END) AS QuizzesLast7Days 
,  COUNT(DISTINCT UQ.Username) AS ParticipantsLast30Days 
,  COUNT(DISTINCT UQ.QuizID) AS QuizzesLast30Days 
,  COUNT(DISTINCT EM.UserName) AS TotalParticipantsInDivisions 
,  COUNT(DISTINCT EM.UserName) - COUNT(DISTINCT UQ.Username) [ParticipantsInDivisionsWithoutQuiz] 
FROM employee EM 
     INNER JOIN Divisions D 
     ON D.SapCode = EM.DivisionCode 
     LEFT OUTER JOIN [UserQuiz] AS UQ 
     ON UQ.UserName = EM.UserName 
      AND DateTimeComplete >= @Last30Days 
GROUP BY [D].[DivisionName] 
"; 

      using (SqlConnection conn = new SqlConnection(connectionString)) 
      { 
       using (SqlCommand cmd = new SqlCommand(query, conn)) 
       { 

        cmd.Parameters.Add(new SqlParameter("@LastSevenDays", last7Days)); 
        cmd.Parameters.Add(new SqlParameter("@Last30Days", last30Days)); 


        SqlDataAdapter sda = new SqlDataAdapter(cmd); 
        sda.Fill(result); 
       } 

      } 

      return result; 
     } 

,然後調用方法如下:

DataTable myData = doQuery(DateTime.Today.AddDays(-7.0), DateTime.Today.AddDays(-30)); 
相關問題