SQL-запрос с несколькими заголовками и несколькими счетчиками - PullRequest
0 голосов
/ 29 октября 2018

У меня есть таблица с деталями задачи клиента (прикрепленная картинка). Я хочу, чтобы результат, как количество задач, полученных за определенный месяц для каждого клиента, нет. задач, выполненных в течение 5 дней с даты начала и их соответствия. Может ли кто-нибудь помочь с запросом SQL

enter image description here

client | No.of tasks of a month | No.of tasks completed on time | % of compliance
A      | 5                      | 4                             | 75%

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

По поводу вашего последнего комментария, это минимальная, не готовая к производству идея:

предположим, у вас есть выпадающий список для месяцев и года

cbYear.DataSource = new int[] { 2017, 2018, 2019 };
cbMonth.DataSource = new string[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dec" };

и просмотр данных dgv , вы можете сделать что-то вроде этого (в кнопке)

        SqlConnection con = new SqlConnection("Data Source=(LocalDb)\\MSSQLLocalDB;Initial Catalog=test;Integrated Security=SSPI");
        con.Open();
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandText = @"
select 
    x.Client
,   x.MonthTasks
,   x.CompletedOnTime
,   Compliance = x.CompletedOnTime * 100 / x.MonthTasks
from (
    select 
        t.Client
   ,    MonthTasks = Count(1)
   ,    CompletedOnTime = SUM(CASE WHEN DATEDIFF(day, t.TaskStart, t.TaskEnd)<=5 THEN 1 ELSE 0 END)
   from tasks as t
   where
        year(t.TaskStart) = @year
   and month(t.TaskStart) = @month
   group by t.Client
) as x
order by x.Client
        ";

        cmd.Parameters.AddWithValue("@year", cbYear.SelectedItem);
        cmd.Parameters.AddWithValue("@month", cbMonth.SelectedIndex +1);

        var dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        var dt = new DataTable();
        dt.Load(dr);

        dgv.AutoGenerateColumns = true;
        dgv.DataSource = dt;
        dgv.Refresh();

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

0 голосов
/ 29 октября 2018

Предполагая, что у вас есть совсем недавний sql-сервер, попробуйте что-то вроде этого (измените имя таблицы и столбцов соответствующим образом).

select 
    x.Client
,   x.MonthTasks
,   x.CompletedOnTime
,   Compliance = x.CompletedOnTime * 100 / x.MonthTasks
from (
    select 
        t.Client
    ,   MonthTasks = Count(1)
    ,   CompletedOnTime = SUM(CASE WHEN DATEDIFF(day, t.TaskStart, t.TaskEnd)<=5 THEN 1 ELSE 0 END)
    from tasks as t
    where
        year(t.TaskStart) = 2018    -- put year
    and month(t.TaskStart) = 10     -- put month
    group by t.Client
) as x
order by x.Client
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...