naif radi Ответов: 2

Используйте оператор 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

Некоторые примеры данных, результаты, которые вы действительно получаете, и результаты, которые вы ожидали, окажутся полезными для нас.

2 Ответов

Рейтинг:
1

CHill60

Учитывая описание того, что вы хотите получить обратно, вы чрезмерно усложняете свой SQL.
Вы также не можете включать элементы в SELECT которые не находятся в GROUP BY и не являются агрегатной функцией.

Я также не являюсь поклонником использования bit колонны с 'True' и 'False' ценности-я предпочитаю более явные 1 и 0 соответственно.

Также будьте осторожны при создании вашей SQL-команды в C# - вы правильно использовали методы SqlParameter, но затем также используете

not ISNULL(isnull(sum(dbo.A_F_Gr.OP_BAL_" & CurYear & "),0.00)
CurYear это также параметр для команды Sql - никогда не объединяйте строки для создания команд Sql.

В общем, я не понимаю, почему следующий запрос не даст вам того, чего вы хотите:
SELECT A.F_Gr_code, A.F_Gr_Name, (SUM(A.Op_Bal_2016) + SUM(D.Dr_Acc_Value) - SUM(D.Cr_Acc_Value)) as CalcValue
FROM [A_F_Gr] A
LEFT OUTER JOIN [JV_Det] D ON A.F_Gr_code=D.AccountNumber AND A.Comp_Id=D.BrId
LEFT OUTER JOIN [JV_Hed] H ON H.JV_No=D.JV_Id AND H.JV_Br=D.BrId
WHERE H.JV_Status = 1 AND H.JV_Del_Status = 0
AND H.JV_date Between @DateFrom and @DateTo
AND A.Comp_Id = @Parameter
GROUP BY A.F_Gr_code, A.F_Gr_Name


Однако если у вас все еще есть проблемы, ответьте на этот пост и, пожалуйста, включите некоторые примеры данных и ожидаемые результаты


Рейтинг:
1

Christian Luketa Kanyinda

Попробуйте добавить различие между Select и A_F_Gr.F_Gr_Name


naif radi

Извините, что вы подразумеваете под "попыткой добавить различие между Select и A_F_Gr.F_Gr_Name"?

CHill60

В этом нет абсолютно никакой необходимости. Distinct когда GROUP BY используется!