Shambhoo kumar Ответов: 1

Подробная таблица sum в запросе linq


Привет друзья,
У меня есть три таблицы это следующие

VisitDetails
VisitId    visitCode   visitDate 
1          V001      15-12-2015


PatientBill
PatientBillId    VisitID     BillCode     PatientPayable      CompanyPayable
1                1           B001          100                 50
2                1           B002          80                  40


PatientBillDetails
PBillDetailsId      PatientBIllId      Gross    Discount    NetPayable
1                   1                  100      25          75
2                   1                  100      25          75
3                   2                  80       20          60
4                   2                  80       20          60


Я хочу такую запись
Первый Выход
VisitCode      PatientPayable        CompanyPayable      NetPayable
V001           180                   90                  270


второй выход
VisitCode     BillCode     PatientPayable        CompanyPayable      NetPayable
V001          B001         100                   50                  150
V001          B002         80                    40                  120



Примечание: - есть некоторые критерии, поэтому я не могу добавить PatientPayable и CompanyPayable сумму для NetPayable. Каждый раз нетто-платежная сумма должна поступать от PatientBillDetails.

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

var result= from VD in VisitDetails 
            join PB in PatientBill on VD.VisitId equal PB.VisitId 
            join PBD in PatientBillDetails on PB.PatientBillId equal PBD.PatientBillId
group new
{
PB.PatientPayable,
PB.CompanyPayable,
PBD.NetPayable
}
by new
{
VD.VisitCode
}
into data
select new
{
VisitCode= data.Key.VisitCode,
PatientPayable= data.sum(x=> x.PatientPayable),
CompanyPayable= data.sum(x=> x.CompanyPayable),
NeyPayable= data.sum(x=> x.NetPayable)
}



Теперь мой выход таков
VisitCode     PatientPayable     ComapanyPayable      NetPayable
V001          360                180                  270


Но я хочу получить такой результат
VisitCode     PatientPayable     ComapanyPayable      NetPayable
V001          180                90                  270

Jon McKee

Разве это не намеренное поведение? У вас есть несколько записей для деталей счета, поэтому объединение их в счет пациента приведет к результату {PB1, PBD1}, {PB1, PBD2}, {PB2, PBD3}, {PB2, PBD4} для каждой детали: пары купюр. Если нет, то я не уверен, какова цель множественного PatientBillDetails записи есть. Если бы вы могли уточнить, что я могу быть в состоянии помочь :)

Shambhoo kumar

Позвольте мне объяснить сценарий: для одного пациента мы можем создать несколько визитов, и для каждого визита мы можем создать несколько счетов пациента, и для каждого счета пациента мы можем создать несколько деталей счета.

Jon McKee

Ах. Если я не знаю, какова цель нескольких деталей счета, я действительно не могу помочь. Вы выбираете самую низкую из возможных деталей счета? Самый высокий? Средний? Если вы не выберете один или не используете алгоритм для объединения их в одно значение, вы всегда получите несколько группировок.

Shambhoo kumar

Ниже Linq запрос работает нормально, но это очень медленно, пожалуйста, помогите мне улучшить этот запрос

var result= from VD in VisitDetails
присоединяйтесь к ПБ в PatientBill на ВД.VisitId равной ПБ.VisitId
группа новая
{
ПБ
}
по новому
{
ВД.VisitCode
}
в данные
выберите новый
{
VisitCode= data. Key.VisitCode,
PatientPayable= сведения.сумма(х=> У Х.ПБ.PatientPayable),
CompanyPayable= data. sum(x=> x. PB.CompanyPayable),
NeyPayable= сведения.Сумма(товар=&ГТ; пункт.ПБ.PatientBillDetails.Сумма(х=> У Х.NetPayable))
}

Jon McKee

Вам не нужно создавать анонимный тип для одного из них.
группа PB по VD. VisitCode в данные
это позволило бы избежать выделения нового типа PB times для каждой группы VD. VisitCode.

Shambhoo kumar

можете ли вы дать вам предложенный запрос?

Jon McKee

Честно говоря, не могу. Несколько PBD производят несколько группировок с соединением VD и PB (или соединение PBD и PB с VD). Если нет способа фильтровать PBD на основе некоторых критериев, у вас всегда будет эта проблема. Приведенный выше пример кода, который игнорирует PBD, имеет оптимизацию (предотвращающую выделение ненужных объектов), но я не уверен, что он выполняет то, что вы хотите. Простым решением было бы разделить результат на 2, но если PBD не равны, то это решение не работает. У меня просто недостаточно информации о цели этой задачи, чтобы дать вам адекватный ответ помимо того, что у меня уже есть :(

Shambhoo kumar

Все в порядке, Макки, спасибо, что уделили мне время. Я очень ценю ваши усилия и время. :)

1 Ответов

Рейтинг:
0

Maciej Los

Для такого требования вы должны "сгруппировать" данные по-другому. Пожалуйста, ознакомьтесь с приведенным ниже примером:

DataTable VisitDetails = new DataTable();
VisitDetails.Columns.Add(new DataColumn("VisitId", typeof(int)));
VisitDetails.Columns.Add(new DataColumn("visitCode", typeof(string)));
VisitDetails.Columns.Add(new DataColumn("visitDate", typeof(DateTime)));
VisitDetails.Rows.Add(new object[]{1, "V001", new DateTime(2015,12,15)});

DataTable PatientBill = new DataTable();
PatientBill.Columns.Add(new DataColumn("PatientBillId", typeof(int)));
PatientBill.Columns.Add(new DataColumn("VisitId", typeof(int)));
PatientBill.Columns.Add(new DataColumn("BillCode", typeof(string)));
PatientBill.Columns.Add(new DataColumn("PatientPayable", typeof(int)));
PatientBill.Columns.Add(new DataColumn("CompanyPayable", typeof(int)));
PatientBill.Rows.Add(new object[]{1, 1, "B001", 100, 50});
PatientBill.Rows.Add(new object[]{2, 1, "B002", 80, 40});

DataTable PatientBillDetails = new DataTable();
PatientBillDetails.Columns.Add(new DataColumn("PBillDetailsId", typeof(int)));
PatientBillDetails.Columns.Add(new DataColumn("PatientBIllId", typeof(int)));
PatientBillDetails.Columns.Add(new DataColumn("Gross", typeof(int)));
PatientBillDetails.Columns.Add(new DataColumn("Discount", typeof(int)));
PatientBillDetails.Columns.Add(new DataColumn("NetPayable", typeof(int)));
PatientBillDetails.Rows.Add(new object[]{1, 1, 100, 25, 75});
PatientBillDetails.Rows.Add(new object[]{2, 1, 100, 25, 75});
PatientBillDetails.Rows.Add(new object[]{3, 2, 80, 20, 60});
PatientBillDetails.Rows.Add(new object[]{4, 2, 80, 20, 60});


var result2 = (from PB in PatientBill.AsEnumerable()
			select new
			{
				VisitId = PB.Field<int>("VisitId"),
				VisitCode = (from VD in VisitDetails.AsEnumerable()
								where VD.Field<int>("VisitId")==PB.Field<int>("VisitId")
								select VD.Field<string>("visitCode")).First(),
				BillCode = PB.Field<string>("BillCode"),
				PatientPayable = PB.Field<int>("PatientPayable"),
				CompanyPayable = PB.Field<int>("CompanyPayable"),
				NetPayable = (from PBD in PatientBillDetails.AsEnumerable()
								where PBD.Field<int>("PatientBIllId")==PB.Field<int>("PatientBIllId") 
								select PBD.Field<int>("NetPayable")).Sum(),
			}).ToList();
//see result #2
var result1 = (from r in result2
				group r by r.VisitCode into g
				select new
				{
					VisitCode = g.Key,
					PatientPayable = g.Sum(x=>x.PatientPayable),
					CompanyPayable = g.Sum(x=>x.CompanyPayable),
					NetPayable = g.Sum(x=>x.NetPayable)
				}).ToList();
//see result #1


Результат №1
VisitCode PatientPayable CompanyPayable NetPayable
V001      180            90             270 


Resutl #2
VisitId VisitCode BillCode PatientPayable CompanyPayable NetPayable
1       V001      B001     100            50             150 
1       V001      B002     80             40             120