SQL连接和条件和
我有两个表格,设置如下:SQL连接和条件和,sql,sql-server,group-by,sum,inner-join,Sql,Sql Server,Group By,Sum,Inner Join,我有两个表格,设置如下: 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
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
表中选择与ZE
表中的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
我还想创建一个名为Distribution
的新列,该列计算行程/(总行程)
,其中总行程将在特定区域编号上求和(通过Origin
或Destination
取决于哪个列与区域等效zone
编号匹配)
例如,对于Origin
1、Destination
1101,我希望该行条目的新Distribution
值为0.6/(0.6+0.7+0.8)
我尝试了以下代码
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子句,我得到的列“2DVISUM\U 2031PMX\U unpiv.Origin”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在group by子句中。如果有group by子句,我得到的列“2DVISUM\U 2031PMmx\U unpiv.Origin”会遇到被零除的错误。
从内部联接中
不应该有任何和
为零,因此我不确定为什么会出现此错误
请帮忙
编辑:我现在使用查询得到重复的行
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
已更新表以显示错误:
泽:
Pmx:
包含具有不同跳闸值的副本的输出:
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\u div
是trips/SUM(trips)over(按Pmx.origin划分)
如上所述。但是,如果Pmx.origin=ZE.Zone
和Pmx.destination=ZE.Zone
那么我希望trips\u div
仍然是trips/SUM(trips)over(按Pmx.origin划分)
。当Pmx.origin不等于ZE.Zone
和Pmx.destination=ZE.Zone
时,则trips/SUM(trips)over(按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
如果我理解您的要求,我认为您可以使用稍微不同的方法来求和,从而使该求和在源表的每一行上都可用。这样,就不需要GROUPBY子句了
SELECT
PMmx.Origin as Origin
, PMmx.Destination as Destination
, (PMmx.Trips/sum(PMmx.Trips) over(partition by Destination)) as 'Distribution'
FROM PMmx
inner join ZE on Origin=ZE.Zone or Destination=ZE.Zone
MS SQL Server 2014架构设置:
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111)
;
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 -- changed to union so duplication is avoided
select
destination, origin, trips, sum_trips, trips_div
from cte
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|--------------------|
| 1101 | 1 | 0.2 | 0.9 | 0.2222222222222222 |
| 1101 | 2 | 0.3 | 0.9 | 0.3333333333333333 |
| 1101 | 3 | 0.4 | 0.9 | 0.4444444444444444 |
| 1 | 1101 | 0.2 | 0.9 | 0.2222222222222222 |
| 2 | 1101 | 0.3 | 0.9 | 0.3333333333333333 |
| 3 | 1101 | 0.4 | 0.9 | 0.4444444444444444 |
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111),
(4, 1211)
;
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
select
destination, origin, trips, sum_trips, trips_div
from cte
order by 1,2,3,4
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|---------------------|
| 1 | 1101 | 0.2 | 1.5 | 0.13333333333333333 |
| 2 | 1101 | 0.3 | 1.5 | 0.2 |
| 3 | 1101 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1 | 0.2 | 1.5 | 0.13333333333333333 |
| 1101 | 2 | 0.3 | 1.5 | 0.2 |
| 1101 | 3 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1211 | 0.5 | 0.5 | 1 |
| 1101 | 1211 | 0.6 | 1.5 | 0.4 |
| 1211 | 1101 | 0.5 | 0.5 | 1 |
| 1211 | 1101 | 0.6 | 1.5 | 0.4 |
查询1:
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111)
;
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 -- changed to union so duplication is avoided
select
destination, origin, trips, sum_trips, trips_div
from cte
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|--------------------|
| 1101 | 1 | 0.2 | 0.9 | 0.2222222222222222 |
| 1101 | 2 | 0.3 | 0.9 | 0.3333333333333333 |
| 1101 | 3 | 0.4 | 0.9 | 0.4444444444444444 |
| 1 | 1101 | 0.2 | 0.9 | 0.2222222222222222 |
| 2 | 1101 | 0.3 | 0.9 | 0.3333333333333333 |
| 3 | 1101 | 0.4 | 0.9 | 0.4444444444444444 |
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111),
(4, 1211)
;
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
select
destination, origin, trips, sum_trips, trips_div
from cte
order by 1,2,3,4
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|---------------------|
| 1 | 1101 | 0.2 | 1.5 | 0.13333333333333333 |
| 2 | 1101 | 0.3 | 1.5 | 0.2 |
| 3 | 1101 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1 | 0.2 | 1.5 | 0.13333333333333333 |
| 1101 | 2 | 0.3 | 1.5 | 0.2 |
| 1101 | 3 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1211 | 0.5 | 0.5 | 1 |
| 1101 | 1211 | 0.6 | 1.5 | 0.4 |
| 1211 | 1101 | 0.5 | 0.5 | 1 |
| 1211 | 1101 | 0.6 | 1.5 | 0.4 |
:
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111)
;
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 -- changed to union so duplication is avoided
select
destination, origin, trips, sum_trips, trips_div
from cte
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|--------------------|
| 1101 | 1 | 0.2 | 0.9 | 0.2222222222222222 |
| 1101 | 2 | 0.3 | 0.9 | 0.3333333333333333 |
| 1101 | 3 | 0.4 | 0.9 | 0.4444444444444444 |
| 1 | 1101 | 0.2 | 0.9 | 0.2222222222222222 |
| 2 | 1101 | 0.3 | 0.9 | 0.3333333333333333 |
| 3 | 1101 | 0.4 | 0.9 | 0.4444444444444444 |
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111),
(4, 1211)
;
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
select
destination, origin, trips, sum_trips, trips_div
from cte
order by 1,2,3,4
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|---------------------|
| 1 | 1101 | 0.2 | 1.5 | 0.13333333333333333 |
| 2 | 1101 | 0.3 | 1.5 | 0.2 |
| 3 | 1101 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1 | 0.2 | 1.5 | 0.13333333333333333 |
| 1101 | 2 | 0.3 | 1.5 | 0.2 |
| 1101 | 3 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1211 | 0.5 | 0.5 | 1 |
| 1101 | 1211 | 0.6 | 1.5 | 0.4 |
| 1211 | 1101 | 0.5 | 0.5 | 1 |
| 1211 | 1101 | 0.6 | 1.5 | 0.4 |
第二部分 MS SQL Server 2014架构设置:
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111)
;
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 -- changed to union so duplication is avoided
select
destination, origin, trips, sum_trips, trips_div
from cte
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|--------------------|
| 1101 | 1 | 0.2 | 0.9 | 0.2222222222222222 |
| 1101 | 2 | 0.3 | 0.9 | 0.3333333333333333 |
| 1101 | 3 | 0.4 | 0.9 | 0.4444444444444444 |
| 1 | 1101 | 0.2 | 0.9 | 0.2222222222222222 |
| 2 | 1101 | 0.3 | 0.9 | 0.3333333333333333 |
| 3 | 1101 | 0.4 | 0.9 | 0.4444444444444444 |
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111),
(4, 1211)
;
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
select
destination, origin, trips, sum_trips, trips_div
from cte
order by 1,2,3,4
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|---------------------|
| 1 | 1101 | 0.2 | 1.5 | 0.13333333333333333 |
| 2 | 1101 | 0.3 | 1.5 | 0.2 |
| 3 | 1101 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1 | 0.2 | 1.5 | 0.13333333333333333 |
| 1101 | 2 | 0.3 | 1.5 | 0.2 |
| 1101 | 3 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1211 | 0.5 | 0.5 | 1 |
| 1101 | 1211 | 0.6 | 1.5 | 0.4 |
| 1211 | 1101 | 0.5 | 0.5 | 1 |
| 1211 | 1101 | 0.6 | 1.5 | 0.4 |
查询1:
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111)
;
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 -- changed to union so duplication is avoided
select
destination, origin, trips, sum_trips, trips_div
from cte
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|--------------------|
| 1101 | 1 | 0.2 | 0.9 | 0.2222222222222222 |
| 1101 | 2 | 0.3 | 0.9 | 0.3333333333333333 |
| 1101 | 3 | 0.4 | 0.9 | 0.4444444444444444 |
| 1 | 1101 | 0.2 | 0.9 | 0.2222222222222222 |
| 2 | 1101 | 0.3 | 0.9 | 0.3333333333333333 |
| 3 | 1101 | 0.4 | 0.9 | 0.4444444444444444 |
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111),
(4, 1211)
;
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
select
destination, origin, trips, sum_trips, trips_div
from cte
order by 1,2,3,4
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|---------------------|
| 1 | 1101 | 0.2 | 1.5 | 0.13333333333333333 |
| 2 | 1101 | 0.3 | 1.5 | 0.2 |
| 3 | 1101 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1 | 0.2 | 1.5 | 0.13333333333333333 |
| 1101 | 2 | 0.3 | 1.5 | 0.2 |
| 1101 | 3 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1211 | 0.5 | 0.5 | 1 |
| 1101 | 1211 | 0.6 | 1.5 | 0.4 |
| 1211 | 1101 | 0.5 | 0.5 | 1 |
| 1211 | 1101 | 0.6 | 1.5 | 0.4 |
:
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111)
;
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 -- changed to union so duplication is avoided
select
destination, origin, trips, sum_trips, trips_div
from cte
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|--------------------|
| 1101 | 1 | 0.2 | 0.9 | 0.2222222222222222 |
| 1101 | 2 | 0.3 | 0.9 | 0.3333333333333333 |
| 1101 | 3 | 0.4 | 0.9 | 0.4444444444444444 |
| 1 | 1101 | 0.2 | 0.9 | 0.2222222222222222 |
| 2 | 1101 | 0.3 | 0.9 | 0.3333333333333333 |
| 3 | 1101 | 0.4 | 0.9 | 0.4444444444444444 |
CREATE TABLE Pmx
([Origin] int, [Destination] int, [Trips] decimal(12,2))
;
INSERT INTO Pmx
([Origin], [Destination], [Trips])
VALUES
(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)
;
CREATE TABLE ZE
([Precinct] int, [Zone] int)
;
INSERT INTO ZE
([Precinct], [Zone])
VALUES
(1, 1101),
(2, 1102),
(3, 1111),
(4, 1211)
;
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
select
destination, origin, trips, sum_trips, trips_div
from cte
order by 1,2,3,4
| origin | destination | trips | sum_trips | trips_div |
|--------|-------------|-------|-----------|---------------------|
| 1 | 1101 | 0.2 | 1.5 | 0.13333333333333333 |
| 2 | 1101 | 0.3 | 1.5 | 0.2 |
| 3 | 1101 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1 | 0.2 | 1.5 | 0.13333333333333333 |
| 1101 | 2 | 0.3 | 1.5 | 0.2 |
| 1101 | 3 | 0.4 | 1.5 | 0.26666666666666666 |
| 1101 | 1211 | 0.5 | 0.5 | 1 |
| 1101 | 1211 | 0.6 | 1.5 | 0.4 |
| 1211 | 1101 | 0.5 | 0.5 | 1 |
| 1211 | 1101 | 0.6 | 1.5 | 0.4 |
非常感谢你!当我被困于如何正确处理问题时,我最终将问题分解成多个表,并以重复行的方式结束(一定是因为连接不正确)。一旦读了你的帖子,我就用这种方式重新做了一遍,一切似乎都很有效!非常感谢。我说得太快了,你已经用过了!我现在似乎得到了源和目标都匹配等价表ZE的条目的重复行。例如,在Pmx中,起点为1101,终点为1102。我似乎不明白为什么会发生这种情况?我不知道您是否可以添加允许复制问题的示例数据。似乎通过上面的查询1,我得到了两行用于起点1101目的地1102,因为行程看起来不同,因为它从起点1102目的地1101条目获取行程,并将其列为起点1101目的地1102。好的,我现在会添加更多的数据。我已经用最后的编辑更新了我的问题-谢谢@Used_By_!对“编辑2”的响应请参见案例表达式为
案例,当Pmx.origin ZE.Zone和Pmx.destination=ZE.Zone然后trips/SUM(trips)over(按Pmx.destination划分)或者trips/SUM(trips)over(按Pmx.origin划分)end
,但这对结果没有影响。