2017-03-15 1 views
0

해결할 문제가있는 아래 SQL이 아래에 있습니다. 기본적으로 가장 높은 parcel_status (3)가 SumofTonnage에 포함되도록 감지되면 면적의 합계를 구해야합니다.SQL 또한 가장 높은 열의 값을 기준으로 나머지 부분을 얻습니다.

: IE 번 parcel_status

id | ACREAGE | FIELD_ID | CROP_CLASS 

1 | 1.34 | 302-234 | RATOON 

2 | 1.64 | 302-235 | RATOON 

3 | 1.54 | 302-236| PLANTCANE 

OUT의 PUT CaneParcel, 0, 1의 상태가 소포 대한 SumofTonnage 얻을 2

SELECT 
    CROP_CLASS As Closed, 
    SUM(tonnage_adjusted) AS SumofTonnage, 
    SUM(ACREAGE) AS SumofAcreage 
FROM 
    CaneParcel 
INNER JOIN 
    DeliveryTons ON CaneParcel.FIELD_ID = DeliveryTons.parcel_id 
WHERE 
    parcel_status = '3' 
GROUP BY 
    CROP_CLASS 
ORDER BY 
    CROP_CLASS ASC 

DeliveryTons

id | parcel_id | tonnage_adjusted | parcel_status 

1 | 302-234 | 34.56 | 1 
2 | 302-234 | 14.56 | 2 
3 | 302-234 | 17.56 | 3 
4 | 302-235 | 8.56 | 1 
5 | 302-236 | 11.56 | 1 
6 | 302-236 | 18.56 | 3 

3

Closed | SumofTonnage | SumofAcreage 

RATOON  66.68 | 2.98 
PLANTCANE 30.12 | 1.54 
+1

나는 어제와 비슷한 질문을 회상하는 것 같지만, 어쨌든 여기에서 작업 할 몇 가지 샘플 데이터를 제공해야합니다. –

+0

sql은 기본적으로 parcel_status가 1,2,3 일 때 총 톤수를 선택합니다. 그러나 그것이 내가 3을 발견했을 때 SUM 1과 2와 3의 톤수를 포함하기를 원합니다. – ivias

+0

값 3의 'parcel_status'가 감지되지 않으면 어떻게됩니까? 그러면 어떻게 합계를 계산합니까? –

답변

0

문제를 올바르게 이해 한 경우 DeliveryTons 테이블에서 조정 된 톤수를 소포로 먼저 집계해야합니다. 단, 해당 소화물의 상태가 3 일 때만 표시됩니다. 아래의 CTE가이를 수행하며 상태 3이 아닌 소포는 해당 CTE의 결과 집합에 나타나지 않습니다.

그런 다음이 결과를 CaneParcel 테이블에 조인하고 자르기 클래스를 다시 집계하려고합니다. 이번에는 효과적인 조정 톤수와 면적을 합친 것입니다. 일부 소포는 기준을 충족시키지 못할 경우 효과적으로 제로 톤수를 갖기 때문에 "유효"톤수라고 말했습니다.

WITH cte AS (
    SELECT parcel_id, SUM(tonnage_adjusted) AS tonnage_adjusted_sum 
    FROM DeliveryTons 
    GROUP BY parcel_id 
    HAVING SUM(CASE WHEN parcel_status = '3' THEN 1 ELSE 0 END) > 0 
) 

SELECT cp.CROP_CLASS As Closed, 
     SUM(ISNULL(dt.tonnage_adjusted_sum, 0)) AS SumofTonnage, 
     SUM(cp.ACREAGE) AS SumofAcreage 
FROM CaneParcel cp 
LEFT JOIN cte dt 
    ON cp.FIELD_ID = dt.parcel_id 
GROUP BY cp.CROP_CLASS 
ORDER BY cp.CROP_CLASS ASC 

당신이 코멘트에서 말하는 것처럼 보인다 것과 달리,이 쿼리는 예상 출력을 생성 않습니다

Rextester

나는 데모 MySQL의 사용을하지만, 논리는 다르지 않을 것이다 SQL Server에서.

+0

이 작동하는 것 같습니다. 나는 그것을 검증하려고 노력할 것이다. 동일한 id를 가진 하나 이상의 소포가 있지만, 하나는 parcel_status로서 3을 가지면 모든 톤수의 합계를 선택해야합니다. (ID-345, 톤수 -45, 상태 -1) (ID-345, 톤수 -5, 상태 -2) (ID-345, 톤수 -13, 상태 -3) 톤돈 합계 = 63 – ivias

+0

그러나 면적이 더해져서는 안되기 때문에 문제가 있습니다. 내가 필요한 것은 평균의 합계입니다. IE. SUM (AVG (Acreage) as SumofAcreage)과 비슷하지만 오류가 발생합니다. 면적은 소포 ID마다 변경되지 않지만 평균의 합계가 필요하기 때문에 평균을 사용합니다. – ivias

+0

@ivias 데이터를 보지 않고도 두 분은 다음과 같은 것을 말합니다 : SUM (평균값의 합을 원한다면 CTE에 쿼리를 넣고 합계를 취할 수 있습니다.) –

관련 문제