#c# #sql-server
#c# #sql-сервер
Вопрос:
У меня есть таблица `tblHistory’ со следующими столбцами, как показано на рисунке
и другую таблицу 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, я ждал вашего ответа. Что случилось с этой проблемой?