выберите вопросы на основе общей суммы строк - PullRequest
0 голосов
/ 07 апреля 2019

Итак, я новичок в C # и asp.net (и вообще в программировании: $) , и я хотел сделать простой генератор бумаги вопрос , но у меня есть некоторые проблемы.

У меня есть таблица 'вопрос'


    [level]       INT    
    [subjectId]   VARCHAR 
    [subjectname] VARCHAR
    [question]    VARCHAR
    [answer]      VARCHAR
    [difficulty]  CHAR 
    [mark]        INT      

с множеством вопросов о другой теме, уровне и отметке .. и т. Д. поэтому я хотел, чтобы пользователь выбрал уровень, subId, сложность и общую оценку. в моем коде он генерирует вопрос на основе выбранных условий (кроме итоговой оценки) и показывает их в виде сетки вместе с отметкой для каждого вопроса, и он работает нормально. то, что я не могу сделать, это общая часть оценки, я хочу, чтобы он выбрал только вопрос о том, что сумма его оценки равна тому, что выбрал пользователь

У меня есть выбор для общего количества баллов

<asp:RadioButtonList ID="total" runat="server">
            <asp:ListItem Value="10">10</asp:ListItem>
            <asp:ListItem Value="15">15</asp:ListItem>
            <asp:ListItem Value="40">40</asp:ListItem>
        </asp:RadioButtonList>

, поэтому я хочу, чтобы, когда пользователь выбрал, например, 10, он выбрал, например, пять вопросов из 2 оценок или любые вопросы с суммой своих оценок, равной 10

Я пробовал много способов. Я использовал

// with group by and w/o the where condition 
" having SUM(mark) = "+total.SelectedValue+ " "

но я по ошибке продублировал строки (5 раз) (без первичного ключа), которые БД рассматривает как одну строку (вопрос с 2 баллами) таким образом, это предложение выделило только эту строку,

и я даже не мог понять, как использовать «где» и «иметь» вместе -> // эта часть решена но он по-прежнему показывает только дублированную запись и ничего не показывает с DISTINCT

но я хочу выбрать разные строки (разные вопросы) с разными отметками но я не знаю как

Итак, возможно ли поставить это условие с моим кодом, и если нет, могу ли я написать код по-другому?

con.Open();
        SqlDataAdapter sda;
                if (dif.SelectedValue == "easy")
                {

                    sda = new SqlDataAdapter("Select subjectId, level, difficulty, question, mark from addquestion where subjectId= '" + sudjectID.SelectedValue + "' and level= " + level.SelectedValue + " and difficulty = '" + dif.SelectedValue + "' ORDER BY NEWID() ", con);
                }
                else if (dif.SelectedValue == "medium")
                {

                    sda = new SqlDataAdapter("Select subjectId, level, difficulty, question, mark from addquestion where subjectId= '" + sudjectID.SelectedValue + "' and level= " + level.SelectedValue + " and difficulty = '" + dif.SelectedValue + "' ORDER BY NEWID() ", con);
                }
                else if (dif.SelectedValue == "hard")
                {

                    sda = new SqlDataAdapter("Select subjectId, level, difficulty, question, mark from addquestion where subjectId= '" + sudjectID.SelectedValue + "' and level= " + level.SelectedValue + " and difficulty = '" + dif.SelectedValue + "' ORDER BY NEWID() ", con);
                }
                else
                    sda = new SqlDataAdapter("Select subjectId, level, difficulty, question, mark from addquestion where subjectId='" + sudjectID.SelectedValue + "' and level=" + level.SelectedValue + " ORDER BY NEWID() ", con);

        sda.SelectCommand.ExecuteScalar();
        DataTable dt = new DataTable();
                sda.Fill(dt);
                GridView1.DataSource = dt;
                GridView1.DataBind();

                con.Close();

Я действительно много чего перепробовал, и я почти прочитал Интернет: '), и посмотрел все YT:'), но я не смог найти никакого решения. даже я надеялся найти сложные вещи, которые я не пойму, но спрошу, как это сделать, но я этого не сделал: ') так что большое спасибо кто поможет <3 </p>

и это моя страница генерации, если это поможет

    <asp:Label ID="Label3" runat="server" Text="Subject ID"></asp:Label>
        <br />
        <asp:DropDownList ID="sudjectID" runat="server">
            <asp:ListItem></asp:ListItem>
            <asp:ListItem>CSC-101</asp:ListItem>
            <asp:ListItem>3-COMP-011</asp:ListItem>
            <asp:ListItem>COMP3-112</asp:ListItem>
            <asp:ListItem>COMP-151</asp:ListItem>
            <asp:ListItem>COMP-213</asp:ListItem>
            <asp:ListItem>INFS-241</asp:ListItem>
            <asp:ListItem>COMP-003</asp:ListItem>
            <asp:ListItem>COMP-336</asp:ListItem>
            <asp:ListItem>COMP-004</asp:ListItem>
            <asp:ListItem>COMP-433</asp:ListItem>
        </asp:DropDownList>
         <br />
        <br />
        <asp:Label ID="Label2" runat="server" Text="Level"></asp:Label>
        <br />
        <asp:DropDownList ID="level" runat="server">
                <asp:ListItem></asp:ListItem>
                <asp:ListItem>1</asp:ListItem>
                <asp:ListItem>2</asp:ListItem>
                <asp:ListItem>3</asp:ListItem>
                <asp:ListItem>4</asp:ListItem>
                <asp:ListItem>5</asp:ListItem>
                <asp:ListItem>6</asp:ListItem>
                <asp:ListItem>7</asp:ListItem>
                <asp:ListItem>8</asp:ListItem>
                <asp:ListItem>9</asp:ListItem>
                <asp:ListItem>10</asp:ListItem>
            </asp:DropDownList>            <br />
        <br />
        <asp:Label ID="Label1" runat="server" Text="Difficulty"></asp:Label>
        <br />
        <asp:RadioButtonList ID="dif" runat="server">
            <asp:ListItem>easy</asp:ListItem>
            <asp:ListItem>medium</asp:ListItem>
            <asp:ListItem>hard</asp:ListItem>
            <asp:ListItem>random</asp:ListItem>
        </asp:RadioButtonList>
        <br />
        <asp:Label ID="Label4" runat="server" Text="Total Mark"></asp:Label>
        <asp:RadioButtonList ID="total" runat="server">
            <asp:ListItem Value="10">10</asp:ListItem>
            <asp:ListItem Value="15">15</asp:ListItem>
            <asp:ListItem Value="40">40</asp:ListItem>
        </asp:RadioButtonList>
        <br />
        <asp:Button ID="Button1" runat="server" Height="35px" OnClick="Button1_Click" Text="Generate" Width="92px" />
         <br />
         <asp:GridView ID="GridView1" runat="server">
        </asp:GridView>

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

У ваших вопросов слишком много сомнений, позвольте мне уточнить один из них ... а затем перейти к остальным.

// и я даже не мог понять, как использовать «где» и«Имея» вместе //

Где предложение используется для фильтрации большого набора данных.

Имея используется для фильтрации сгруппированных данных.В основном используется с предложением Group By.

В этом примере я запрашиваю фильтрацию для вопросов с количеством баллов> 2, затем группирую баллы и отображаю все баллы, в которых есть как минимум 3 вопроса.

ВЫБРАТЬ Счет, Считать () в виде вопросов по баллу ОТ Вопросы, где оценка> 2 Группировать по баллу Имея счет ()> = 3

0 голосов
/ 07 апреля 2019

для этой части

и я даже не мог понять, как использовать «где» и «иметь» вместе

это простой синтаксис для него:

SELECT columns, aggratiotion functions (e.g. SUM, COUNT ..etc)
FROM tableName
WHERE 
    column = value 
GROUP BY columns 
HAVING 
 (aggratiotion functions) = value 

пример:

SELECT 
    subjectId
,   level
,   difficulty
,   question
,   SUM(mark) 
FROM 
    addquestion 
WHERE 
    subjectId   = somevalue
AND level       = somevalue
AND difficulty  = somevalue
GROUP BY 
    subjectId
,   level
,   difficulty
,   question
HAVING 
    SUM(mark) = somevalue

для части C # вы все усложняете для себя. дайте себе перерыв и забудьте об этом, это поможет вам больше сосредоточиться, а также прояснить мысли, когда вы снова работаете над этим.

Для начала, вы можете просто настроить запрос так:

"SELECT DISTINCT subjectId, level, difficulty, question, SUM(mark) FROM addquestion WHERE subjectId = '" + sudjectID.SelectedValue + "' AND level = " + level.SelectedValue + " AND difficulty = '" + dif.SelectedValue + "' GROUP BY subjectId, level, difficulty, question HAVING SUM(mark) = " + total.SelectedValue + " ORDER BY NEWID()";

Тот же принцип. Дополнительный DISTINCT позволит избежать дубликатов.

Хотя рекомендуется использовать параметризованный запрос, но я не хотел, чтобы все было хуже;). Пока вы учитесь, сосредоточьтесь на том, что вы изучаете, и со временем вы освоите и эту часть.

вот пример из вашего кода (не тестировался, это просто для демонстрации).

string query = string.Empty;

string[] difficulties = {"easy", "medium", "hard"};

if(!difficulties.Contains(dif.SelectedValue))
{ 
    query = string.Format("SELECT DISTINCT subjectId, level, difficulty, question, SUM(mark) FROM addquestion WHERE subjectId = '{0}' AND level = {1} GROUP BY subjectId, level, question HAVING SUM(mark) = {2} ORDER BY NEWID()", sudjectID.SelectedValue, level.SelectedValue, total.SelectedValue); 
}       
else
{
    query = string.Format("SELECT DISTINCT subjectId, level, difficulty, question, SUM(mark) FROM addquestion WHERE subjectId = '{0}' AND level = {1} AND difficulty = '{2}' GROUP BY subjectId, level, difficulty, question HAVING SUM(mark) = {3} ORDER BY NEWID()", sudjectID.SelectedValue, level.SelectedValue, dif.SelectedValue, total.SelectedValue); 
}       


var dataTable = new DataTable(); 

using(SqlConnection con = new SqlConnection(ConnectionString))
using(SqlCommand command =  new SqlCommand(query, con))
using(SqlDataAdapter adapter = new SqlDataAdapter(command))
{
    con.Open();
    adapter.Fill(dataTable);
}

GridView1.DataSource = dataTable;
GridView1.DataBind();

все, что находится под выбором, будет показано пользователю, если вы хотите скрыть, например, СУММУ (отметку), просто удалите его из выбора.

ОБНОВЛЕНИЕ

    if (!difficulties.Contains(dif.SelectedValue.ToLower()))
    {

        query = string.Format("SELECT subjectId, level, difficulty, question FROM (SELECT *, SUM(mark) OVER(PARTITION BY subjectId ORDER BY subjectId ROWS UNBOUNDED PRECEDING) TotalMark FROM addquestion) d WHERE subjectId = '{0}' AND level = {1} AND TotalMark <= {2}", sudjectID.SelectedValue.ToString().Trim().ToLower(), level.SelectedValue, total.SelectedValue);
    }
    else
    {
        query = string.Format("SELECT subjectId, level, difficulty, question FROM (SELECT *, SUM(mark) OVER(PARTITION BY subjectId, difficulty ORDER BY subjectId ROWS UNBOUNDED PRECEDING) TotalMark FROM addquestion) d  WHERE subjectId = '{0}' AND level = {1} AND TotalMark <= {2} AND difficulty = '{3}'", sudjectID.SelectedValue.ToString().Trim().ToLower(), level.SelectedValue,total.SelectedValue, dif.SelectedValue.ToString().Trim().ToLower());
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...