【问题标题】:SQL Query needs revisionSQL 查询需要修改
【发布时间】:2020-01-20 21:40:13
【问题描述】:

我有以下疑问:

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

以及下表示例:

交货吨数

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_seasons 中提取数据一样。谁能看看sql有没有问题?

【问题讨论】:

  • 您可能需要将AND d.crop_season = a.crop_season 添加到您的JOIN 条件中
  • 这样做给了我更多的钱
  • 这似乎很奇怪,因为添加该条件应该进一步限制行数,而不是增加行数。不幸的是,您没有提供足够的样本数据来重现问题,如果您可以使用更多数据编辑问题以便重现问题,那么它会更容易回答。
  • @Kaii 抱歉,这不会导致更多行
  • 给定示例的预期输出是什么?

标签: sql summary


【解决方案1】:

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

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

也许您想清理数据并添加UNIQUE KEY(REAPING_GROUP_CODE, CROP_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

【讨论】:

  • 您的代码在关键字“组”附近显示语法错误。
  • @ivias 已更新,复制粘贴时丢失了一个 AND
  • 好的。这个查询似乎接近总数,但是 FarmerGroups 中的 REAPING_GROUP_CODES 也可以在不同的 ASSN 中。
猜你喜欢
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 2021-05-22
  • 2017-10-27
  • 2011-10-12
  • 1970-01-01
相关资源
最近更新 更多