抱歉....应该说,这是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,除了将要计算的值之外的任何值。有任何想法吗?
提前致谢!
马修
答案 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.
在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