SQL Запрос требует пересмотра - PullRequest
1 голос
/ 21 января 2020

У меня есть следующий запрос:

With Summary as (
Select a.ASSN As Association
      ,SUM(tonnage_adjusted) as TotalTonnage
      ,SUM(case when remarks = '' THEN tonnage_adjusted ELSE NULL END) as Monitored
      ,SUM(case when remarks = 'NO_TICKET' THEN tonnage_adjusted ELSE NULL END) as NotMonitored
From DeliveryTons d INNER JOIN FarmerGroups a ON d.reaping_code = a.REAPING_GROUP_CODE 
WHERE reaping_code IS NOT NULL AND d.crop_season = 4 
Group By a.ASSN
)

SELECT Association
  ,TotalTonnage
  , COALESCE(Monitored,0) As Monitored
  , COALESCE(NotMonitored,0)As NotMonitored
  , COALESCE(((Monitored/TotalTonnage) * 100),0) as pct_Monitored
FROM Summary 
Order by Association,TotalTonnage

И следующие примеры таблиц:

DeliveryTons

id | parcel_id | crop_season | tonnage_adjusted | reaping_code | remarks 
1    012-0075       4               25.60            NSCGA12     
2    011-0089       3               17.58            PSCPA      NO_TICKET 
3    001-0541       3               14.58            PSCPA       
4                   2               18.50            NSCGA12    NO_TICKER

FarmerGroups

ID | ASSN  |   REAPING_GROUP_CODE  |  CROP_SEASON
1    CSCPA        NSCGA12                  4
2    PSCPA        PSCPA                    3
3    PSCPA        NSCGA12                  4

I Я хочу получить итоговые значения tonnage_adjusted по ассоциациям, однако мне кажется, что я получаю более высокие суммы tonnage_adjusted, чем на самом деле есть в crop_season. Почти как получение данных из других crop_seasons. Кто-нибудь может увидеть, если что-то не так с sql?

1 Ответ

1 голос
/ 21 января 2020

Похоже, что соединение извлекает более 1 подходящей строки из таблицы FarmGroups, что приводит к перекрестному продукту.

Я полагаю, что это не должно, но теперь у вас есть несколько записей для одной и той же комбинации ReapingCode / Season.

Может быть, вы хотите очистить свои данные и добавить UNIQUE KEY(REAPING_GROUP_CODE, CROP_SEASON), чтобы избежать таких дубликатов в будущем. Если я правильно понимаю, один REAPING_GROUP_CODE в указанном c СЕЗОН может быть отнесен только к одному ASSN.

Если это невозможно, вы все равно можете сделать это, чтобы исключить дублирование во время запроса, но оно не будет работать так же хорошо, как очистка + изменение схемы:

With Summary as (
Select a.ASSN As Association
      ,SUM(tonnage_adjusted) as TotalTonnage
      ,SUM(case when remarks = '' THEN tonnage_adjusted ELSE NULL END) as Monitored
      ,SUM(case when remarks = 'NO_TICKET' THEN tonnage_adjusted ELSE NULL END) as NotMonitored
FROM DeliveryTons d 
    /* NOTE the SELECT DISTINCT subquery here */
    INNER JOIN 
    (SELECT DISTINCT 
         ASSN,REAPING_CODE_GROUP,CROP_SEASON FROM FarmerGroups 
         WHERE CROP_SEASON = 4
    ) a 
    ON d.reaping_code = a.REAPING_GROUP_CODE 
    AND d.crop_season = a.CROP_SEASON
WHERE reaping_code IS NOT NULL 
Group By a.ASSN
)

SELECT Association
  ,TotalTonnage
  , COALESCE(Monitored,0) As Monitored
  , COALESCE(NotMonitored,0)As NotMonitored
  , COALESCE(((Monitored/TotalTonnage) * 100),0) as pct_Monitored
FROM Summary 
Order by Association,TotalTonnage
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...