Sql server 连接三个表并根据条件选择一条记录

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,距

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表中的预期结果

#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