Member 13174737 Ответов: 1

Как я могу вычесть из суммы одного столбца сумму другого столбца в одной таблице данных SQL


Вот моя таблица данных Sql, пожалуйста, помогите, как я могу проверить сумму баланса в руке с Дипаком и Абдулом отдельно, я новичок Vb.net. Пожалуйста, помогите мне.

Имя Человека Дата Кредит Дебет
Дипак 5/4/2017 5000.00 Нуль
Дипак 6/4/2017 Нуль-4500.00
Дипак 30/4/2017 2000.00 Нуль
Абдул 1/5/2017 3000.00 Null
Абдул 2/5/2017 Null 2000.00
Абдул 4/5/2017 Null 5000.00

Если я буду искать Дипак из текстового поля в форме окна, то баланс в руке должен быть показан 2500.00 и
Если я буду искать Абдула из текстового поля в форме окна, то баланс в руке должен быть показан -4000.00

Что я уже пробовал:

Дим УМК Как Нового Sqlclient Как.Команда sqlcommand
Dim Con Как Новый SqlClient.SqlConnection
Dim Rd Как SqlDataReader
Зубрить.ConnectionString = " источник данных=(localdb)\MSSQLLocalDB; начальный каталог=dbase;Интегрированная безопасность=True;пул = False"
УМК.Подключение = Кон
Кон. Открыт()
УМК.CommandText = "Select * From Daybookcash Where PersonName = '" & Tbdbkname.Текст &"'"
РД = ЦМД.Метода executereader
РД.Читать()
Если У РД. Есть Деньги, То
Тбамткашихх.Текст = РД.Пункт("Кредит") - РД.Пункт("Дебет")
Конец, Если

CHill60

Я обновил свой пост

1 Ответов

Рейтинг:
1

CHill60

Никогда не объединяйте строки для создания SQL-запроса-вместо этого используйте параметризованные запросы. Этот код должен быть

Cmd.CommandText = "Select * From Daybookcash Where PersonName = @tbdbkname"
Cmd.Parameters.AddWithValue("@tbdbkname",Tbdbkname.Text)

Также не используйте Select * From - перечислите столбцы, которые вы хотите явно
Select [PersonName], [Date], Credit, Debit From ...

Вероятно, самый простой способ получить баланс - это запросить базу данных с помощью
select [Personname], sum(Credit) - sum(Debit) as balance from Daybookcash GROUP BY [PersonName]
Используйте то же самое предложение Where, что и выше, если вам это нужно.

Другой вариант - посмотреть на результаты запроса, который у вас есть, так, как вы это делаете. Беда в том, что у вас есть null данные в вашей таблице, так что вы, вероятно, получаете исключение
Цитата:
Оператор ' - 'не определен для типа 'Decimal' и типа 'DBNull'.
Ты можешь любой проверьте наличие нулевых элементов перед их использованием, например:
Dim y As Decimal
If Not Decimal.TryParse(Rd.Item("Debit").ToString(), y) Then
    y = 0
End If
Dim x As Decimal
If Not Decimal.TryParse(Rd.Item("Credit").ToString(), x) Then
    x = 0
End If
Tbamtcashih.Text = (x - y).ToString()
Или оставьте вычисление более или менее таким, как оно есть, и измените запрос так, чтобы значения NULL не возвращались, например так:
Select [PersonName], [Date], ISNULL(Credit,0) as Credit, ISNULL(Debit,0) as Debit From ...
.Не забудьте использовать .Метод ToString (), как указано выше.

[РЕДАКТИРОВАТЬ]
Как и было запрошено здесь есть полное решение:
Using con As New SqlConnection

    con.ConnectionString = constring
    con.Open()
    Using cmd As New SqlCommand
        cmd.Connection = con
        cmd.CommandText = "select [Personname], sum(Credit) as Credit, sum(Debit) as Debit from Daybookcash where [PersonName] = @tbdbkname GROUP BY [PersonName]"
        cmd.Parameters.AddWithValue("@tbdbkname", "Deepak")
        Dim rd As SqlDataReader = cmd.ExecuteReader

        If rd.HasRows Then
            rd.Read()
            Dim y As Decimal
            If Not Decimal.TryParse(rd.Item("Debit").ToString(), y) Then
                y = 0
            End If
            Dim x As Decimal
            If Not Decimal.TryParse(rd.Item("Credit").ToString(), x) Then
                x = 0
            End If
            Tbamtcashih.Text = (x - y).ToString()
        End If

    End Using

End Using
Или вот так (что я предпочитаю)
Using con As New SqlConnection

    con.ConnectionString = constring
    con.Open()
    Using cmd As New SqlCommand
        cmd.Connection = con
        cmd.CommandText = "select [Personname], sum(Credit) - sum(Debit) as Balance from Daybookcash where [PersonName] = @tbdbkname GROUP BY [PersonName]"
        cmd.Parameters.AddWithValue("@tbdbkname", "Deepak")
        Dim rd As SqlDataReader = cmd.ExecuteReader

        If rd.HasRows Then
            rd.Read()
            Tbamtcashih.Text = rd.Item("Balance").ToString()
        End If

    End Using
End Using


Member 13174737

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

CHill60

Я не знаю, что вы сделали, но я получаю разные значения для "Абдул" и "Дипак". Я жестко закодировал "Дипак" в качестве поиска в приведенном выше коде, потому что у меня не было текстового поля - вам нужно будет изменить его, чтобы поместить значение из текстового поля в качестве значения параметра(ов)

Member 13174737

Большое спасибо, да, вы правы. я ошибся в кодировании. Большое вам спасибо за вашу помощь, очень ценю.