В случае, когда FarmerGroups МОЖЕТ создать несколько строк для одной записи BSI_CODE, предварительно агрегируйте флаги таблицы групп фермеров ONCE для BSI_CODE. ТОГДА можно суммировать, не создавая ложного декартова результата ...
Думайте о внутреннем "PQ" (PreQuery) как о выполнении двоичного ИЛИ между строками. Все, что вас волнует, - это любой отдельный BSI_CODE, существует ли он, имеет ли он пустой статус (или нет) и его статус доставки. Итак, учитывая данные образца ...
FarmerGroups
BSI_CODE Assn Remarks Delivery_Status
A BSICGP test B
A BSICGP C
A BSICGP test C
A BSICGP A
---------------------------------
B BSICGP test B
B BSICGP test C
---------------------------------
C BSICGP test B
---------------------------------
D BSICGP
D BSICGP X
---------------------------------
E BSICGP test1 C
E BSICGP test2 C
---------------------------------
Теперь сводка каждого BSI_CODE будет выглядеть как
BSI_CODE NoRemarks IsTonDelivery
A 1 1 (at least 1 record had no remarks, at least 1 record was NOT 'C' status)
B 0 1 (NO records had empty remarks, at least 1 was NOT 'C' status)
C 0 1 (only 1 record. It had a remark, but as NOT 'C' status)
D 1 1 (both no remarks, neither was 'C' status)
E 0 0 (both HAD remarks and BOTH were 'C' status).
Таким образом, вы можете видеть, что 11 записей из группы фермеров суммированы в 5 строк с соответствующими столбцами "флагов", равными 1 или 0.
В несколько аналогичном подходе для вашего "CaneParcel" предварительно суммируйте площадь на основе идентификатора поля, чтобы он тоже получал по одной строке на поле, чтобы быть ЛЕВОЙ ПОДКЛЮЧЕНИЕМ к тоннам доставки ... СОЕДИНЕНИЕ к FarmerGroups предварительно квалифицирует эту часть в переходном состоянии.
Теперь, если в вашей таблице DeliveryTons есть 5 записей для «D», то при суммировании, подсчете или умножении на флаг получится 0 или значение, пытающееся получить агрегат. Вы можете присоединиться к своей таблице DeliveryTons, и, поскольку каждый из ваших подзапросов полагался на Crop_Season = 3, вы можете просто применить это к внешнему запросу, но потянув вышеуказанный запрос в пределах ...
select
count(*) as Deliveries,
sum( case when dt.remarks = '' then 1 else 0 end ) as Tickets,
sum( dt.Tonnage_Adjusted
* case when dt.delivery_status != 'C' then 1 else 0 end ) as TonsDelivered,
sum( dt.Tonnage_Adjusted
* case when dt.remarks = '' then 1 else 0 end ) as TonsMonitored,
sum( PQ2.totalAcreage ) AcresMonitored,
sum( case when dt.parcel_status = '3' then cp.Acreage else 0 end
* case when dt.remarks = '' then 1 else 0 end ) TotalClosedAcres
from
DeliveryTons dt
JOIN
(SELECT DISTINCT
BSI_CODE,
FROM
FarmerGroups fg
WHERE
ASSN = 'BSICGP' ) PQ
ON dt.farmer_pay_bsi = PQ.BSI_CODE
LEFT JOIN
(select
cp.Field_ID,
sum( cp.Acreage ) totalAcreage
from
CaneParcel cp
group by
cp.Field_ID ) PQ2
on dt.parcel_id = PQ2.Field_ID
where
dt.Crop_Season = 3
Это может быть много, но вы уверены, что (не видя ваши фактические производственные данные - или даже выборочные данные), вы будете работать как два быстрых агрегата Pre-Query (PQ и PQ2) один раз и непосредственно соединены (слева) присоединиться) к таблице DeliveryTons. Я бы попробовал это по частям, чтобы увидеть / подтвердить происходящее.
ОБНОВЛЕНИЕ ЗА КОММЕНТАРИЙ
Обновлен запрос. Без ваших примеров данных мой запрос был написан с подразумеваемым форматом / содержанием. После просмотра ваших данных обратите внимание, что в таблице farmerGroups нет значения для комментариев, а в таблице тоннажа - нет. Скорректированный запрос для размещения.