Выберите и обновите, используя тот же запрос в SQL SERVER c#

#c# #sql-server

#c# #sql-сервер

Вопрос:

У меня есть таблица `tblHistory’ со следующими столбцами, как показано на рисунке

tblHistory

и другую таблицу tblDue со следующими столбцами, как показано на рисунке

tblDue

Что я пытаюсь сделать, это получить сумму amountdue из tblHistory с checked=0 , а затем обновить эту сумму до столбца amountdue на tblDue .

Вся новая строка, добавленная в tblHistory , будет иметь checked=0 изначально и после получения суммы и обновления tblDue , она должна быть checked=1 включена tblHistory , чтобы отмеченная строка не добавлялась снова.

Пожалуйста, помогите мне, как это можно сделать.

Что я пробовал до сих пор

     using (SqlConnection sqlConnection = new SqlConnection(connstring))
            {
                string regdno = txtRegdno.Text;
                SqlCommand sqlCmd = new SqlCommand("select  Sum(isnull(cast(amountdue as float),0)) as amountdue from tblHistory where regdno = '"   txtRegdno.Text   "' and checked='0' , sqlConnection);
                sqlConnection.Open();
                SqlDataReader sqlReader = sqlCmd.ExecuteReader();

                while (sqlReader.Read())
                {

                    textBox1.Text = (sqlReader["amountdue"].ToString());



                    }


                }

                sqlReader.Close();
            }
  

Это возвращает сумму всех ‘amountdue’ . Я хочу суммировать только то, что имеет значение ‘checked = 0’, а затем после вычисления суммы его значение должно быть ‘checked = 1’, И для новых строк оно снова должно суммироваться для ‘checked = 0’

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

1. Могут ли новые строки, которые добавляются, tblHistory иметь то же regdno , что и при предыдущей загрузке? Я имею в виду, может ли потребоваться обновить совокупное amountdue значение?

2. Что вы пробовали? Вы делаете это на C # или пытаетесь сделать это в SQL?

3. @Andrew да, у них одинаковый regdno, и да, совокупная сумма должна быть обновлена до tblDue, и эти агрегированные строки должны иметь значение = 1

4. id Установлены ли столбцы в качестве идентификатора?

5. я делаю это в c # @Hammerstein.

Ответ №1:

Простой ответ заключается в том, что вы не можете выполнить select и update в одном и том же (одном) операторе, это две разные операции.

Ответ №2:

Если вы хотите сделать это в базе данных, вы можете сделать что-то вроде этого:

 INSERT INTO tblDue
SELECT regdno, SUM(amountdue)
FROM tblHistory
WHERE checked = 0
AND regdno NOT IN (SELECT regdno FROM tblDue)
GROUP BY regdno

UPDATE d
SET amountdue = SUM(h.amountdue)
FROM tblDue d
INNER JOIN tblHistory h ON d.regdno = h.regdno
WHERE d.regdno IN (SELECT regdno FROM tblHistory WHERE checked = 0)
GROUP BY d.regdno

UPDATE tblHistory
SET checked = 1
WHERE regdno IN (SELECT regdno FROM tblDue)
  

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

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

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

1. я обновил вопрос с помощью кода c #, который я пробовал до сих пор.

2. после кода, который я обновил, чтобы получить checked = 1. Проблема, с которой я сталкиваюсь, заключается в том, что в следующий раз он просто добавляет значение checked = 0 и отбрасывает предыдущую полученную сумму. Я хочу, чтобы новая сумма была добавлена к предыдущей сумме

3. Есть ли эта проблема в моем скрипте? Я рассмотрел это. INSERT Для совершенно новых, regdno а UPDATE для существующих, поэтому он суммирует все, не обращая внимания на checked статус.

4. @Sdp, я ждал вашего ответа. Что случилось с этой проблемой?