Если нет данных для конкретной даты, верните 0 в качестве результата для этой даты

#c# #sql #asp.net #sql-server

#c# #sql #asp.net #sql-сервер

Вопрос:

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

Вот код..

Для даты я использую этот код..

 List<string> ChartDates = new List<string>();
int i =-29, j = 0;
while (i <= j)
{
    ChartDates.Add(DateTime.Now.AddDays(i).ToShortDateString());
    i  ;
}
StringBuilder s = new StringBuilder();
s.Append("<script>");
s.Append("var DatesArray = new Array;");
foreach (string str in ChartDates)
{
    s.AppendFormat("DatesArray.push('" str "');");
}
s.Append("</script>");
//sending data through client script register
ClientScript.RegisterStartupScript(this.GetType(), "Dates", s.ToString());
  

Данные для моей диаграммы..

 List<int> Addmissions = new List<int>();
SqlCommand cmd = new SqlCommand("select count(Add_id), Std_submit_date from IMS_Addmission WHERE Std_submit_date >= dateadd(day, datediff(day, 0, GetDate()) - 30, 0)GROUP BY Std_submit_date", con);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
    Addmissions.Add(Convert.ToInt32(dr[0].ToString()));
}
dr.Close();
con.Close();

StringBuilder sb = new StringBuilder();
sb.Append("<script>");
sb.Append("var Addmission_No = new Array;");
foreach (int str in Addmissions)
{
    sb.AppendFormat("Addmission_No.push({0});", str);
}
sb.Append("</script>");
//sending data through client script register
ClientScript.RegisterStartupScript(this.GetType(), "AddmissionNo", sb.ToString());
  

Что мне нужно сделать, чтобы получить значение 0 для каждой даты, когда данных нет.

Комментарии:

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

2. Да, вы правы, я хочу то же самое, что вы думаете @SeanLange

3. Если вы можете предоставить некоторые образцы данных и желаемый результат, я буду рад показать вам лучший способ, чем использование циклов для этого. Вот отличное место для начала. spaghettidba.com/2015/04/24 /…

Ответ №1:

Я думаю, вы хотите обновить строку sql до этого

 SELECT COALESCE(SUM(Add_id), 0)
  

Комментарии:

1. COUNT никогда не вернет NULL . Подсчитывается количество строк.

2. @SeanLange Я думаю, что это сделает это, принимая во внимание ваш комментарий. 🙂

3. Это будет работать, если есть строка, но у меня такое чувство, что они хотят, чтобы их запрос возвращал строки для дат, где нет данных. Надеюсь, OP появится снова, чтобы мы могли ответить на их вопрос.

Ответ №2:

Попробуйте это, может быть, это может сработать для вас.

 if exists (select * from IMS_Addmission WHERE Std_submit_date >= dateadd(day, datediff(day, 0, GetDate()) - 30, 0) GROUP BY Std_submit_date)
begin
select  count(Add_id), Std_submit_date from IMS_Addmission WHERE Std_submit_date >= dateadd(day, datediff(day, 0, GetDate()) - 30, 0) GROUP BY Std_submit_date
end
else
begin
select 0 as Result
end
  

Ответ №3:

Вот мой ответ, он работает хорошо…

 //Date for loop
        List<string> ChartDates = new List<string>();
        int i = -29, j = 0;
        while (i <= j)
        {
            ChartDates.Add(DateTime.Now.AddDays(i).ToShortDateString());
            i  ;
        }

        //Addmission Data Value for Chart
        List<int> AddmissionData = new List<int>();
        int k = -29, l = 0;
        while (k <= l)
        {
           AddmissionData.Add(0);
            k  ;
        }
        //Counting Addmission Per Day 
        List<int> Addmissions = new List<int>();
        List<string> AddmissionDate = new List<string>();
        SqlCommand cmd = new SqlCommand("select count(Add_id), Std_submit_date from IMS_Addmission WHERE Std_submit_date >= dateadd(day, datediff(day, 0, GetDate()) - 30, 0)GROUP BY Std_submit_date", con);
        con.Open();
        SqlDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
        {
            Addmissions.Add(Convert.ToInt32(dr[0].ToString()));
            DateTime cd7 = Convert.ToDateTime(dr["Std_submit_date"].ToString(), System.Globalization.CultureInfo.GetCultureInfo("hi-IN").DateTimeFormat);
            string datenow = cd7.ToShortDateString();
            AddmissionDate.Add(datenow);
        }
        dr.Close();
        con.Close();
        int b = 0;
        foreach (string str in ChartDates)
        {
            int c = 0;
            foreach(string str2 in AddmissionDate)
            {
                if(str == str2)
                {
                    AddmissionData[b] = Addmissions[c];
                }
                c  ;
            }

            b  ;
        }
        // Sending Addmission Data For Chart
        StringBuilder sb = new StringBuilder();
        sb.Append("<script>");
        sb.Append("var Addmission_No = new Array;");
        foreach (int str in AddmissionData)
        {
            sb.AppendFormat("Addmission_No.push({0});", str);
        }
        sb.Append("</script>");
        //sending data through client script register
        ClientScript.RegisterStartupScript(this.GetType(), "AddmissinNo", sb.ToString());

        // (Addmission_No) is the array containg Value for Chart.
        //Addmission Data For Chart End
  

Комментарии:

1. Использование подобного цикла ужасно неэффективно. Вы можете сделать это с помощью одного запроса.

2. тогда что я могу сделать. Можете ли вы мне помочь @SeanLange. Что мне нужно, вы это очень хорошо знаете.