Sql server 连接三个表并根据条件选择一条记录
ShipmentID 1的成本总和为1000,距离为1000成本总和 对于ShipmentID 2为8000,距离为8000 ShipmentID的成本总和 3是16000,距离是16000 ShipmentID 1的总成本为13500,距离为2000总成本 对于ShipmentID 2,距离为2300,距离为9000,这是ShipmentID成本的总和 3是16500,距离是4500 ShipmentID 1的成本总和为2100,距离为3600成本总和 ShipmentID 2为11350,距离为3100,为 ShipmentID 3是12020,距离是15000 选择成本最低的路线。距离无关紧要。所有其他路由显示为空 TempResults表中的预期结果Sql server 连接三个表并根据条件选择一条记录,sql-server,Sql Server,ShipmentID 1的成本总和为1000,距离为1000成本总和 对于ShipmentID 2为8000,距离为8000 ShipmentID的成本总和 3是16000,距离是16000 ShipmentID 1的总成本为13500,距离为2000总成本 对于ShipmentID 2,距离为2300,距离为9000,这是ShipmentID成本的总和 3是16500,距离是4500 ShipmentID 1的成本总和为2100,距离为3600成本总和 ShipmentID 2为11350,距
#TransportationMode3 (indicates Water)
ShipmentID NOT NULL,
Origin NULL,
Stop1 NULL,
Stop2 NULL,
Destination NULL,
Distance NULL,
Cost NULL
---------------------------------------------------------------------------------
ShipmentID Origin Stop1 Stop2 Destination Distance Cost
1 Chicago Newyork NULL NULL 1500 500
1 NULL Newyork Minneapolis NULL 100 300
1 NULL NULL Minneapolis Atlanta 2000 1300
2 Portland Chicago NULL NULL 3000 11000
2 NULL Chicago Newyork NULL 100 130
2 NULL NULL Newyork Atlanta 500 220
3 Portland NULL NULL Atlanta 15000 12020
---------------------------------------------------------------------------------
以下是TempResults的定义:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ShipmentID Origin Stop1 Stop2 Destination TransportationMode1 Distance1 Cost1 TransportationMode2 Distance2 Cost2 TransportationMode3 Distance3 Cost3
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 Chicago NULL NULL Atlanta Road 500 1000 NULL NULL NULL NULL NULL NULL
2 Portland Chicago NULL Atlanta NULL NULL NULL Rail 9000 2300 NULL NULL NULL
3 Portland NULL NULL Atlanta NULL NULL NULL NULL NULL NULL Water 15000 12020
如何使用单个sql语句实现这一点
#TempResults
ShipmentID NOT NULL,
Origin NOT NULL,
Stop1 NULL,
Stop2 NULL,
Destination NOT NULL,
TransportationMode1 NULL,
TransportationDistance1 NULL,
TransportationCost1 NULL,
TransportationMode2 NULL,
TransportationDistance2 NULL,
TransportationCost2 NULL,
TransportationMode3 NULL,
TransportationDistance3 NULL,
TransportationCost3 NULL
如果我完全理解这个问题,你可以做如下事情
INSERT INTO TempResults(
ShipmentID,
Origin,
Stop1,
Stop2,
Destination,
TransportationMode1,
Distance1,
Cost1,
TransportationMode2,
Distance2,
Cost2,
TransportationMode3,
Distance3,
Cost3)
SELECT
RoadCosts.ShipmentID,
RoadCosts.OriginSite,
RoadCosts.Stop1,
RoadCosts.Stop2,
RoadCosts.DestinationSite,
????
FROM ((#TransportationMode1 RoadCosts
INNER JOIN #TransportationMode2 RailCosts ON RoadCosts.ShipmentID = RailCosts.ShipmentID)
INNER JOIN #TransportationMode3 WaterCosts ON RoadCosts.ShipmentID = WaterCosts.ShipmentID)
这是可行的,但也存在一些问题。它在结果集中返回单个记录、多个装运ID。我想合并记录并以最低成本显示路线。第二批货的最佳路线是波特兰-芝加哥-亚特兰大。这是最低的总成本吗?没错。所有其他模式、距离、成本值显示为空,而不是实际值。分组时如何选择?起点和终点1
#TempResults
ShipmentID NOT NULL,
Origin NOT NULL,
Stop1 NULL,
Stop2 NULL,
Destination NOT NULL,
TransportationMode1 NULL,
TransportationDistance1 NULL,
TransportationCost1 NULL,
TransportationMode2 NULL,
TransportationDistance2 NULL,
TransportationCost2 NULL,
TransportationMode3 NULL,
TransportationDistance3 NULL,
TransportationCost3 NULL
INSERT INTO TempResults(
ShipmentID,
Origin,
Stop1,
Stop2,
Destination,
TransportationMode1,
Distance1,
Cost1,
TransportationMode2,
Distance2,
Cost2,
TransportationMode3,
Distance3,
Cost3)
SELECT
RoadCosts.ShipmentID,
RoadCosts.OriginSite,
RoadCosts.Stop1,
RoadCosts.Stop2,
RoadCosts.DestinationSite,
????
FROM ((#TransportationMode1 RoadCosts
INNER JOIN #TransportationMode2 RailCosts ON RoadCosts.ShipmentID = RailCosts.ShipmentID)
INNER JOIN #TransportationMode3 WaterCosts ON RoadCosts.ShipmentID = WaterCosts.ShipmentID)
WITH CTE1
AS
(
SELECT
RoadCosts.Scenario,
RoadCosts.ShipmentID,
SUM(RoadCosts.Distance) AS Distance,
SUM(RoadCosts.Cost) AS Cost
FROM
#TransportationMode1 RoadCosts
GROUP BY
RoadCosts.Scenario,
RoadCosts.ShipmentID
UNION ALL
SELECT
RailCosts.Scenario,
RailCosts.ShipmentID,
SUM(RailCosts.Distance) AS Distance,
SUM(RailCosts.Cost) AS Cost
FROM
#TransportationMode2 RailCosts
GROUP BY
RailCosts.Scenario,
RailCosts.ShipmentID
UNION ALL
SELECT
WaterCosts.Scenario,
WaterCosts.ShipmentID,
SUM(WaterCosts.Distance) AS Distance,
SUM(WaterCosts.Cost) AS Cost
FROM
#TransportationMode3 WaterCosts
GROUP BY
WaterCosts.Scenario,
WaterCosts.ShipmentID
), CTE2
AS
(
SELECT
A.ShipmentID,
MIN(Distance) MinDistance,
MIN(Cost) MinCost,
FROM
CTE1 A
GROUP BY
A.ShipmentID
)
SELECT
*
FROM
CTE1 A INNER JOIN
CTE2 B ON A.ShipmentID = B.ShipmentID AND
A.Distance = B.MinDistance AND
A.Cost = B.MinCost