【问题标题】:Finding Customers Last Price Paid查找客户最后支付的价格
【发布时间】:2015-07-08 10:01:28
【问题描述】:

我正在尝试找到一种方法让客户支付最后的价格,我们目前拥有的代码是:

SELECT Product.ProductCode,
       COUNT(Product.ProductCode) AS [Qty Baught],
       Product.Description,
       Customer.CustomerCode,
       Customer.Name,
       MAX(OrderHeader.DateTimeCreated) AS [Date],
       OrderLine.UnitSellPriceInCurrency AS Sell
FROM Customer
  INNER JOIN OrderHeader ON Customer.CustomerID = OrderHeader.CustomerID
  INNER JOIN OrderLine ON OrderHeader.OrderID = OrderLine.OrderID
  INNER JOIN Product ON OrderLine.ProductID = Product.ProductID
GROUP BY Product.Description,
         Product.ProductCode,
         Customer.CustomerCode,
         Customer.Name,
         OrderLine.UnitSellPriceInCurrency
HAVING (Product.ProductCode = 'bcem002')
   AND (Customer.CustomerCode = '1000')
ORDER BY MAX(OrderHeader.DateTimeCreated) DESC  

此代码显示每次价格更改但我只想查看最后一个价格,但 DateCreated 和支付的价格 (UnitSellPriceInCurrency) 在不同的表上。

有没有办法按 (DateCreated) 分组 (UnitSellPriceInCurrency) 或其他方法。

我在这方面还很陌生,所以如果有明显的做法,对不起。

编辑:我现在用新代码得到了什么,我得到的大部分价格都与产品无关

我想要的是只显示最后支付的价格,但在某种程度上我可以更改我正在搜索的客户和产品。

【问题讨论】:

  • 请提供sqlfiddle.com 表结构和虚拟数据。同时显示它的预期输出。
  • 您可以将条件移至 WHERE 子句。 HAVING 子句用于聚合函数条件。
  • 您是否确实验证了输出的重要部分是否有效?我一直看到COUNT(Product.ProductCode) AS [Qty Baught] - 并且怀疑这一点是正确的......
  • @Abecee 是的,我知道我已将其更改为“SUM(OrderLine.Quantity) AS [Qty Bought]”

标签: sql sql-server-2008 group-by


【解决方案1】:

一种选择可能是使用子选择,利用TOP 指定您只想检索一条记录,并使用ORDER BY 确保它是“最新的”:

SELECT Product.ProductCode,
       COUNT(Product.ProductCode) AS [Qty Baught],
       Product.Description,
       Customer.CustomerCode,
       Customer.Name,
       MAX(OrderHeader.DateTimeCreated) AS [Date],
         (SELECT TOP 1 O.UnitSellPriceInCurrency 
          FROM OrderLine O 
          INNER JOIN OrderHeader OH ON O.OrderID = OH.OrderID 
          WHERE OH.CustomerID = Customer.CustomerID AND O.ProductID = Product.ProductID
          ORDER BY OH.DateTimeCreated DESC) AS LatestPrice
FROM Customer
  INNER JOIN OrderHeader ON Customer.CustomerID = OrderHeader.CustomerID
  INNER JOIN OrderLine ON OrderHeader.OrderID = OrderLine.OrderID
  INNER JOIN Product ON OrderLine.ProductID = Product.ProductID
WHERE  (Customer.CustomerCode = '1000') AND (Product.ProductCode = 'bcem002')
GROUP BY Product.Description,
         Product.ProductCode,
         Product.ProductID,
         Customer.CustomerCode,
         Customer.Name,
         Customer.CustomerID
ORDER BY [Date] DESC

在此示例中,LatestPrice 将包含每个客户和产品最后插入的 UnitSellPriceInCurrency。我不确定查询是否对您的数据有意义(为什么只获得最后一个价格),但这就是我解释您的请求的方式。该查询仍将返回所有 OrderHeaders。

【讨论】:

  • 谢谢,但我收到“GROUP BY 子句错误。无法解析查询文本。”当我脱下Have时似乎会这样做
  • 感谢它确实提出了一个错误,说 OrderHeader.OrderID 不在 GroupBy 中,所以我把它放进去,现在它只显示所有价格的列表,其中一些看起来不相关
  • @Richard 我又想到了你真正想要的数据。我更改了查询以返回每个客户和产品的最新价格。我觉得这更有意义,但您必须对此做出判断。
  • @Richard Yeh,这不是一个友好的性能查询。我认为它可以进行相当多的优化,但是否值得取决于使用情况。对于繁忙的前端,它需要改进。一种可能使其更快的方法是将ORDER BY OH.DateTimeCreated DESC 替换为ORDER BY OH.OrderID DESC,假设它会给出相同的结果(我认为最近的Date 将具有最大的OrderID,但我不知道这一点)。原因是 OrderID 应该被索引,我猜 Date 不是。
  • 刚刚尝试使用这两种方法搜索产品组。 date 花了 34 秒,按 id 花了 18 秒,结果是一样的,所以再次感谢。它不是针对前端的,它可能会每年运行一次,让每个客户将最后支付的价格与可能的价格上涨进行比较。非常感谢您的帮助。
【解决方案2】:

你能检查一下这个工作正常吗。如果您发布当前结果和您需要的预期结果的快照会更好。

            Select 
        *
        FROM
        (
        SELECT Product.ProductCode,
               COUNT(Product.ProductCode) AS [Qty Baught],
               Product.Description,
               Customer.CustomerCode,
               Customer.Name,
               OrderHeader.DateTimeCreated AS [Date],
               OrderLine.UnitSellPriceInCurrency AS Sell
               RANK() OVER (PARTITION BY Customer.CustomerCode,Customer.Name, OrderLine.UnitSellPriceInCurrency ORDER BY OrderHeader.DateTimeCreated) rnk
        FROM Customer
          INNER JOIN OrderHeader ON Customer.CustomerID = OrderHeader.CustomerID
          INNER JOIN OrderLine ON OrderHeader.OrderID = OrderLine.OrderID
          INNER JOIN Product ON OrderLine.ProductID = Product.ProductID
        WHERE Product.ProductCode = 'bcem002'
        AND   Customer.CustomerCode = '1000'
        GROUP BY Product.Description,
                 Product.ProductCode,
                 Customer.CustomerCode,
                 Customer.Name,
                 OrderLine.UnitSellPriceInCurrency
        ) tbl1 
        WHERE tbl1.rnk =1 
        ; 

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多