내가 설정 두 개의 테이블이 요약 :SQL 조인 및 조건은 다음과
PMmx
- 출발지 - 목적지 행렬의 테이블 버전은
Origin Destination Trips
1 1 0.2
2 1 0.3
3 1 0.4
. . .
. . .
1 1101 0.6
2 1101 0.7
3 1101 0.8
. . .
. . .
1101 1 0.2
1101 2 0.3
1101 3 0.4
ZE
- 영역이있는 테이블은
Precinct Zone
1 1101
2 1102
3 1111
PMmx
테이블의 행 항목을의 Zone
열과 일치시키려는 항목을 선택하고 싶습니다.테이블. 예를 들어 :
Origin Destination Trips
1 1101 0.6
2 1101 0.7
3 1101 0.8
. . .
. . .
1101 1 0.2
1101 2 0.3
1101 3 0.4
가 나는 또한 (중 Origin
또는 Destination
이있는 열을 따라하여 총 여행은 특정 영역의 수를 합산됩니다 Trips/(Total Trips)
을 계산 Distribution
라는 새 열을 생성하고자하는 영역 등가 일치 Zone
number). 해당 행 항목이 0.6/(0.6+0.7+0.8)
을 할 수 있도록 Origin
1 예를 들어
Destination
(1101), 나는 새로운
Distribution
값을합니다.
다음 코드
SELECT
PMmx.Origin as Origin
,PMmx.Destination as Destination
,PMmx.Trips/sum(PMmx.Trips) as 'Distribution'
FROM PMmx
inner join ZE on Origin=ZE.Zone or Destination=ZE.Zone
Group by Origin, Destination, Trips
이 GROUP BY 절없이 같은 정확한 결과를 얻을 수 있다면 확실하지 오전을 시도 나는 Column '2DVISUM_2031PMmx_unpiv.Origin' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
를 얻을 그리고 GROUP BY 절과 나는에서 Divide by zero error encountered.
를 얻을 수 inner join
sums
은 0이 아니어야합니다. 따라서이 오류가 발생하는 이유는 확실하지 않습니다.
도와주세요!
편집 :
ZE :
Precinct Zone
1 1101
2 1102
3 1111
4 1211
PMX :
Origin Destination Trips
1 1 0.20
2 1 0.30
3 1 0.40
1 1101 0.60
2 1101 0.70
3 1101 0.80
1101 1 0.20
1101 2 0.30
1101 3 0.40
1101 1211 0.60
1211 1101 0.50
나는 오류를 표시하는 쿼리 with cte as (
select
origin, destination, trips
, SUM(Trips) over(partition by Pmx.Origin) sum_trips
, trips/SUM(Trips) over(partition by Pmx.Origin) trips_div
from Pmx
inner join ZE on Pmx.Origin = ZE.Zone
)
select
origin, destination, trips, sum_trips, trips_div
from cte
union all
select
destination, origin, trips, sum_trips, trips_div
from cte
업데이트 테이블을 사용하여 현재 중복 행을 얻고있다다른 여행의 값개
출력 포함 중복 :
origin destination trips sum_trips trips_div
1101 1 0.20 1.50 0.13333333333333333333333333
1101 2 0.30 1.50 0.20000000000000000000000000
1101 3 0.40 1.50 0.26666666666666666666666666
1101 1211 0.60 1.50 0.40000000000000000000000000
1211 1101 0.50 0.50 1.00000000000000000000000000
1 1101 0.20 1.50 0.13333333333333333333333333
2 1101 0.30 1.50 0.20000000000000000000000000
3 1101 0.40 1.50 0.26666666666666666666666666
1211 1101 0.60 1.50 0.40000000000000000000000000
1101 1211 0.50 0.50 1.00000000000000000000000000
편집 2 : 내가 만들 걸려에 'if 문'그래서 Pmx.origin =ZE.Zone
경우 다음 trips_div
위와 같이 trips/SUM(Trips) over(partition by Pmx.Origin)
입니다. 그러나 Pmx.origin =ZE.Zone
및 Pmx.destination=ZE.Zone
인 경우 trips_div
이 여전히 trips/SUM(Trips) over(partition by Pmx.Origin)
이길 원합니다. Pmx.origin does not equal ZE.Zone
및 Pmx.destination=ZE.Zone
일 때 trips/SUM(Trips) over(partition by Pmx.Destination)
입니다. 나는 다양한 case when
문장을 시도했지만 제대로 작동하지 않는 것처럼 보입니다.
나는 출력이되고 싶습니다 : 나는 당신의 요구 사항을 이해한다면
origin destination trips sum_trips trips_div
1 1101 0.20 2.10 0.0952380952380952
2 1101 0.30 2.10 0.1428571428571429
3 1101 0.40 2.10 0.1904761904761905
1101 1 0.20 1.50 0.1333333333333333
1101 2 0.30 1.50 0.2000000000000000
1101 3 0.40 1.50 0.2666666666666666
1101 1211 0.60 1.50 0.4000000000000000
1211 1101 0.50 0.50 1.0000000000000000
응답이 http://sqlfiddle.com/#!6/e8020/6를 볼 경우 식의 경우시'PMX입니다 .origin <> ZE.Zone 및 Pmx.destination = ZE.Zone 다음에/SUM (Trips) 이상 (Pmx.Destination에 의한 파티션) 그 밖의 trip/SUM (Trips) 이상 (Pmx.Origin에 의한 파티션) end'하지만 결과에 아무런 영향을 미치지 않습니다. –