我有一个Product
表,我将其加入OrderTracking
表
SELECT Product.ProductCode,
FROM Product LEFT OUTER JOIN OrderTracking
ON Product.ProductCode=OrderTracking.ProductCode
GROUP BY ProductCode
我的OrderTracking表中有过去和将来的产品订单信息。 我的目标是如果有一个产品的未来订单我想在同一行中列出其中的前2个(最接近2个订单到今天)。如果将来没有订单,列将为null,或者如果将来只有一个订单,则第二列将为null。示例行将是这样的:
ProductCode
1stClosestDeliveryDate
2ndShippingNumber
SELECT Product.ProductCode, 1stClosestDeliveryDate,1tClosestOrderAmount,
1stShippingNumber,2stClosestOrderDate, 2stClosestDeliveryAmount,
2stShippingNumber
FROM Product LEFT OUTER JOIN OrderTracking
ON Product.ProductCode = OrderTracking.ProductCode
GROUP BY Product.ProductCode
我应该使用GETDATE()
函数并与其他日期值进行比较,但我无法弄清楚如何从OrderTracking表中获取这些值。任何帮助将不胜感激...
答案 0 :(得分:1)
ROW_NUMBER
使用CTE
:
WITH orders AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY ProductCode ORDER BY OrderDate ASC) AS RNumber
, ProductCode
, OrderDate
, OrderAmount
, OrderShippingNumber
FROM OrderTracking
WHERE OrderDate > GETDATE()
)
SELECT Product.ProductCode
, 1stClosestOrderDate = O1.OrderDate
, 1tClosestOrderAmount = O1.OrderAmount
, 1stShippingNumber = O1.OrderShippingNumber
, 2stClosestOrderDate = O2.OrderDate
, 2stClosestOrderAmount = O2.OrderAmount
, 2stShippingNumber = O2.OrderShippingNumber
FROM Product
LEFT OUTER JOIN orders AS O1 ON Product.ProductCode = O1.ProductCode AND O1.RNumber = 1
LEFT OUTER JOIN orders AS O2 ON Product.ProductCode = O2.ProductCode AND O2.RNumber = 2;
在你发布的结构中有一些列丢失,所以我猜到了一些名字,但上面应该是获得最终结果的起点。
第一个SELECT
(CTE
)收集有关按产品添加行号的订单的数据:行号= 1的行是该产品的下一个订单,而数字= 2的行是第二个下一个订单。
第二个SELECT
可以加入表& CTE
获取所需的输出。
警告:CTE
语法要求前一个语句(如果有)由;
终止。由于结束分号不是强制性的,因此在具有多个语句的脚本中运行整个语句时,很容易忘记它并出现语法错误。