MySQL - 一对多加入 - 从“一个”表中仅返回1行的结果

时间:2015-10-09 21:47:03

标签: mysql sql

抱歉....应该说,这是MySQL。

好的......首先,我不知道我是否真的可以做我想做的事情。我有一些SQL经验,但不是很多。希望有人可以提供帮助。

我有两张桌子,一张有订单,一张有货。我可以在它们之间进行连接并获得正确的结果.....

订单表

Order_ID |  Revenue  |
1001     |  125.00   |
1002     |  215.31   |
1003     |  654.43   |

货件表

Order_ID | Shipment_ID |  Item Count  |
1001     |    99001    |      25      |
1001     |    99002    |       5      |
1002     |    99003    |      65      |
1003     |    99004    |     123      | 
1003     |    99005    |      20      |

在Order_ID上直接连接,我得到了预期的结果:

Order_ID | Revenue  | Shipment_ID |  Item Count  |
1001     |  125.00  |   99001     |      25      |
1001     |  125.00  |   99002     |       5      |
1002     |  215.31  |   99003     |      65      |
1003     |  654.43  |   99004     |     123      | 
1003     |  654.43  |   99005     |      20      |

如果可能的话,我试图在相同的输出中调和收入和成本。我从一张单独的表中了解到我的每件货物的成本是多少,因此数学很简单。但是,我的收入是这样的,因为我在收入列中有重复,因为多个货件的订单。

我想得到以下内容:

Order_ID | Revenue  | Shipment_ID |  Item Count  |
1001     |  125.00  |   99001     |      25      |
1001     |  NULL    |   99002     |       5      |
1002     |  215.31  |   99003     |      65      |
1003     |  654.43  |   99004     |     123      | 
1003     |  NULL    |   99005     |      20      |

重复收入数字的值可以为null,空白,0,除了将要计算的值之外的任何值。有任何想法吗?

提前致谢!

马修

1 个答案:

答案 0 :(得分:0)

在MySQL中,您可以使用以下查询:

SELECT s1.Order_ID, s1.Shipment_ID, s1.Item_Count, 
       IF(s1.Shipment_ID = s2.minS_ID, o.Revenue, 0) AS Revenue
FROM Shipments AS s1
INNER JOIN (
   SELECT Order_ID, MIN(Shipment_ID) AS minS_ID
   FROM Shipments
   GROUP BY Order_ID
) AS s2 ON s1.Order_ID = s2.Order_ID
INNER JOIN Orders AS o ON s1.Order_ID = o.Order_ID

我们的想法是使用包含每Shipment_ID最小Order_ID的派生表执行其他连接。如果当前行的Shipment_ID值等于此值,则返回Revenue,否则返回0.

Demo here

在SQL Server中,您可以使用MIN的窗口版本进行比较:

SELECT s.Order_ID, Shipment_ID, Item_Count,
       CASE 
          WHEN MIN(Shipment_ID) OVER (PARTITION BY s.Order_ID) = Shipment_ID THEN Revenue
          ELSE 0
       END AS Revenue            
FROM Shipments AS s
INNER JOIN Orders AS o ON s.Order_ID = o.Order_ID