Используйте оператор conditinal select из нескольких таблиц и используйте sum
Всем привет,
Я создаю программу, подключенную к базе данных SQL Server, имя базы данных (SMIG_ICT_Store), есть три таблицы:
1 - [A_F_Gr] имеет эти поля:
- Строка F_Gr_code', Содержащая Код Учетной Записи
- Строка F_Gr_Name', Содержащая Имя Учетной Записи
- Op_Bal_2016 Двойной - Содержащий открытый баланс счета.
- Номер ветви строки Comp_Id '
2 - [JV_Hed] имеет эти поля:
- Строка JV_No', содержащая номера JV
- Дата JV_date Date 'дата
- Jv_status Bit ' является ли JV опубликованным или нет
- Бит JV_Del_Status ' удален ли JV или нет
- Номер ветви строки JV_Br '
3 - [JV_Det] имеет эти поля:
- Строка JV_Id', содержащая номер JV из JV_Hed в качестве ключа иностранца
- Строка AccountNumber', содержащая номер счета из A_F_Gr в качестве ключа иностранца
- Dr_Acc_Value Двойной "Имейте значение дебетовой транзакции
- Cr_Acc_Value Двойной - Иметь стоимость кредитной операции
- Филиал № строки брод '
Я создаю связь между этими тремя таблицами вот так:
- [A_F_Gr]. [F_Gr_Code] = [JV_Det].[AccountNumber]
[A_F_Gr].[Comp_Id] = [JV_Det].[Брид]
Один ко многим
- [JV_Hed].[JV_No] = [JV_Det].[JV_Id]
[JV_Hed].[JV_Br] = [JV_Det].[Брид]
Один ко многим
Теперь я хочу получить все учетные записи A_F_Gr.F_Gr_code,A_F_Gr.F_Gr_Name,Sum(A_F_Gr. Op_Bal_2016) +
(Сумма(JV_Det.Dr_Acc_Value) - Сумма(JV_Det.Cr_Acc_Value)
Где JV_Hed.JV_Status = 'True' и JV_Del_Status = 'False'
И A_f_gr. Comp_Id = @параметр
И JV_Hed.Дата между @DateFrom и @DateTo
Группа по A_f_gr. F_Gr_code
Я пробовал много способов, но я получаю неправильный результат, как
SELECT A_F_Gr.F_Gr_Name, A_F_Gr.F_Gr_Code, ISNULL(SUM(A_F_Gr.OP_BAL_2016),0.00) + ISNULL( (SELECT ISNULL(SUM(JV_Det.Dr_Acc_Value), 0.00) - ISNULL(SUM(JV_Det.Cr_Acc_Value), 0.00)as Tot FROM JV_Hed INNER JOIN JV_Det ON JV_Hed.JV_No = JV_Det.JV_Id AND JV_Hed.JV_Year = JV_Det.JV_Year AND JV_Hed.JV_Br = JV_Det.BrId WHERE JV_Hed.JV_Date Between '01-01-2016' AND '12-31-2016' AND JV_Hed.JV_Del_Status = 'False' AND JV_Hed.JV_Status = 'True' ),0.00) FROM A_F_Gr WHERE A_F_Gr.F_Upper_Group_Code = '1102' And A_F_Gr.Comp_Id = '1' GROUP BY A_F_Gr.F_Gr_Name, A_F_Gr.F_Gr_Code
Так что, пожалуйста, помогите мне.
Что я уже пробовал:
SQLString = "SELECT dbo.A_F_Gr.F_Gr_Code, ISNULL(isnull(sum(dbo.A_F_Gr.OP_BAL_" & CurYear & "),0.00) + (ISNULL(sum(JV_Det.Dr_Acc_Value),0.00) - ISNULL(sum(JV_Det.Cr_Acc_Value),0.00)),0.00) as Balance FROM dbo.JV_Det INNER JOIN dbo.JV_Hed ON dbo.JV_Hed.JV_No = dbo.JV_Det.JV_Id and JV_Date between @DateFrom AND @DateTo AND JV_Del_Status = @DelStatus and JV_Status = @JVStatus RIGHT JOIN dbo.A_F_Gr ON dbo.A_F_Gr.F_Gr_Code = dbo.JV_Det.AccountNumber AND dbo.A_F_Gr.Comp_Id = dbo.JV_Det.BrId WHERE dbo.A_F_Gr.Comp_Id = @CompID AND dbo.JV_Det.BrId = @JVBR AND dbo.A_F_Gr.F_Upper_Group_Code = @Upper GROUP BY dbo.A_F_Gr.F_Gr_Code HAVING not ISNULL(isnull(sum(dbo.A_F_Gr.OP_BAL_" & CurYear & "),0.00) + (ISNULL(sum(JV_Det.Dr_Acc_Value),0.00) - ISNULL(sum(JV_Det.Cr_Acc_Value),0.00)),0.00) <= 0" Using com As New SqlCommand(SQLString, conn) com.Parameters.AddWithValue("@CompID", BRID) com.Parameters.AddWithValue("@JVBR", BRID) com.Parameters.AddWithValue("@Upper", Trim(TxtAccount.Text)) com.Parameters.AddWithValue("@DelStatus", False) com.Parameters.AddWithValue("@JVStatus", True) com.Parameters.AddWithValue("@DateFrom", DateFrom) com.Parameters.AddWithValue("@DateTo", DateTo) If Not conn.State = ConnectionState.Open Then conn.Open() com.ExecuteNonQuery() Adpt = New SqlDataAdapter(com) End Using Adpt.Fill(AccountsDt)
CHill60
Некоторые примеры данных, результаты, которые вы действительно получаете, и результаты, которые вы ожидали, окажутся полезными для нас.