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
我有以下查询:
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