Как исправить этот запрос, чтобы он хорошо работал с приложением ASP.NET? - PullRequest
2 голосов
/ 08 декабря 2011

С помощью моего друга я смог ответить на этот сложный запрос.

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, и я не знал, что мне следует делатьделать с этим.Любая помощь, пожалуйста?

Я знаю, может быть, мой вопрос кажется легким, но я много пробовал и потерпел неудачу с ним.Пожалуйста, помогите мне

Ответы [ 4 ]

2 голосов
/ 08 декабря 2011

Вставьте его в сохраненный процесс и вызовите процесс.

0 голосов
/ 09 декабря 2011

В .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));
0 голосов
/ 08 декабря 2011

Вы можете встроить свои переменные и иметь стандартный оператор выбора, например, так:

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 голосов
/ 08 декабря 2011

@ LastSevenDays и @ Last30Days - это параметры, используемые вашим запросом, поэтому SqlDataSource запрашивает их.

Вы можете сделать три вещи:

  • Создайте хранимую процедуру и вызовите ее (см. Второй пример, который вызывает хранимую процедуру)
  • Удалите параметры и вставьте функцию DATEADD везде, где вы обычно ссылаетесь на переменную
  • Используйте FilterParameter в вашем SqlDataSource и настройте его инициализацию в коде.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...