Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL连接和条件和_Sql_Sql Server_Group By_Sum_Inner Join - Fatal编程技术网

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
,但这对结果没有影响。