SQL 查询需要修改

SQL Query needs revision

我有以下查询:

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

以及以下 table 个示例:

交货吨数

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

农民团体

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

我想通过关联获得 tonnage_adjusted 总和,但是我得到的 tonnage_adjusted 总和似乎比 crop_season 的实际总和要高。几乎与从其他 crop_season 中提取数据一样。谁能看看 sql 是否有问题?

似乎连接从 FarmGroups table 中提取了 1 个以上的匹配行,从而产生了叉积。

我想它不应该,但现在您有多个条目用于相同的 ReapingCode/Season 组合。

也许您想清理数据并添加一个 UNIQUE KEY(REAPING_GROUP_CODE, CROP_SEASON) 以避免将来出现此类重复。如果我没理解错的话,一个特定的SEASON里的一个REAPING_GROUP_CODE只能算一个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