【问题标题】:Need to return last purchase date for items that have not been purchased for more than 180 days超过 180 天未购买的商品需要返回最后购买日期
【发布时间】:2013-09-26 03:43:41
【问题描述】:

为数据库中的慢动作者构建报告。我想知道 180 天内没有购买过的商品并显示最近的购买日期。日期以日期时间格式 mm/dd/yyyy HH:MM:SS.000 存储 这是我最近的尝试,我正在尝试自学 sql 以帮助工作,因此感谢任何帮助和解释。数据库是 MS SQL。

SELECT
    Inventory.LocalSKU, 
    InventorySuppliers.SupplierSKU, 
    MAX([Order Details].DetailDate)

FROM            
    Inventory INNER JOIN
    InventorySuppliers ON Inventory.LocalSKU = InventorySuppliers.LocalSKU 
    INNER JOIN
    [Order Details] ON InventorySuppliers.LocalSKU = [Order Details].SKU 
    CROSS JOIN
    POHistory

WHERE     
    GETDATE() >= CONVERT(date,DATEADD(DAY,+30,[Order Details].DetailDate))
ORDER  BY
    [Order Details].DetailDate DESC

【问题讨论】:

标签: sql sql-server date datetime


【解决方案1】:

你可以试试:

SELECT
    Inventory.LocalSKU, 
    InventorySuppliers.SupplierSKU, 
    MAX([Order Details].DetailDate)

FROM            
    Inventory INNER JOIN
    InventorySuppliers ON Inventory.LocalSKU = InventorySuppliers.LocalSKU 
    INNER JOIN
    [Order Details] ON InventorySuppliers.LocalSKU = [Order Details].SKU 
    CROSS JOIN
    POHistory

WHERE     
    GETDATE() >= CONVERT(date,DATEADD(DAY,180,[Order Details].DetailDate))
    GROUP BY
            Inventory.LocalSKU, 
            InventorySuppliers.SupplierSKU, 
ORDER  BY
    MAX([Order Details].DetailDate) DESC

【讨论】:

  • 您的 WHERE 子句将过滤掉超过 xx 天的订单。相反,您要做的是识别最后一次下单时间超过 xx 天的产品。
  • @PhilSandler 号码不正确,但与您的号码相同。
  • 在分组之前过滤掉新记录不是更好吗(为了性能)?
  • 感谢 Phil 和 Szymon。过滤后分组的好建议。我边走边学,非常感谢您的帮助。再次感谢。
  • 它与我的 not 相同,并且 not 没有按照问题的要求进行操作。如果昨天订购了库存商品,它仍会在此查询中返回,因为它正在被过滤掉。
【解决方案2】:

类似这样的东西(未检查语法):

SELECT
    Inventory.LocalSKU, 
    InventorySuppliers.SupplierSKU, 
    MAX([Order Details].DetailDate)

FROM            
    Inventory 
    INNER JOIN InventorySuppliers ON Inventory.LocalSKU = InventorySuppliers.LocalSKU 
    INNER JOIN [Order Details] ON InventorySuppliers.LocalSKU = [Order Details].SKU 
    CROSS JOIN POHistory --what is this here for?
GROUP BY
    Inventory.LocalSKU, 
    InventorySuppliers.SupplierSKU
HAVING     
    --your question said 180 days, but your code had 30 days?
    GETDATE() >= CONVERT(date,DATEADD(DAY,180,MAX([Order Details].DetailDate)))
ORDER  BY
    [Order Details].DetailDate DESC

【讨论】:

  • 抱歉,我在测试时离开了三十天,看看我是否正确地影响了返回的值。 POHistory 是为了以后我可以查看上次为产品创建 PO 的时间,如果我可以让它工作的话。
  • 我尝试了这段代码,它允许我使用 max 函数,但现在 HAVING 部分不再起作用,它返回与 MAX 之前相同的错误
【解决方案3】:

这是我最终用来识别慢速和零动者的完整代码,感谢大家的帮助。

    SELECT suppliers.suppliername, 
       inventory.localsku,
       inventorysuppliers.suppliersku,
       inventory.itemname, 
       inventory.Text2 as "Outlet",
       inventory.Text3 as "Season",
       inventory.Text5 as "Discount",
       inventory.qoh, 
       Max(CONVERT(DATE, [Order Details].detaildate)) AS [Last Ordered], 
       Max(CONVERT(DATE, pohistory.date))             AS [Last PO], 
       inventory.discontinued 
FROM   inventory 
       INNER JOIN inventorysuppliers 
               ON inventory.localsku = inventorysuppliers.localsku 
       INNER JOIN suppliers 
               ON inventorysuppliers.supplierid = suppliers.supplierid 
       INNER JOIN pohistory 
                    ON inventorysuppliers.suppliersku = pohistory.supplierssku 
       INNER JOIN [Order Details] 
                    ON inventorysuppliers.localsku = [Order Details].sku 
WHERE  ( Getdate() >= CONVERT(DATE, Dateadd(month, 6, [Order Details].detaildate)) ) 
       AND ( inventory.discontinued = 0 ) 
       AND ( Getdate() <= CONVERT(DATE, Dateadd(month, 5, pohistory.date)) )
       AND inventory.discontinued = 0 
OR
       ( [Order Details].detaildate IS NULL ) 
       AND ( inventory.discontinued = 0 ) 
       AND ( Getdate() <= CONVERT(DATE, Dateadd(month, 5, pohistory.date)) )
       AND inventory.discontinued = 0 

GROUP  BY inventory.localsku, 
          inventorysuppliers.suppliersku, 
          inventory.itemname, 
          suppliers.suppliername, 
          inventory.qoh, 
          inventory.discontinued, 
          inventory.Text2,
          inventory.Text3,
          inventory.Text5
HAVING    ( inventory.QOH > 0)

UNION

SELECT suppliers.suppliername, 
       inventory.localsku,
       inventorysuppliers.suppliersku,
       inventory.itemname, 
       inventory.Text2 as "Outlet",
       inventory.Text3 as "Season",
       inventory.Text5 as "Discount",
       inventory.qoh, 
       Max(CONVERT(DATE, [Order Details].detaildate)) AS [Last Ordered], 
       Max(CONVERT(DATE, pohistory.date))             AS [Last PO], 
       inventory.discontinued 
FROM   inventory 
       INNER JOIN inventorysuppliers 
               ON inventory.localsku = inventorysuppliers.localsku 
       INNER JOIN suppliers 
               ON inventorysuppliers.supplierid = suppliers.supplierid 
       INNER JOIN pohistory 
                    ON inventorysuppliers.suppliersku = pohistory.supplierssku 
       LEFT OUTER JOIN [Order Details] 
                    ON inventorysuppliers.localsku = [Order Details].sku 
WHERE      ( [Order Details].detaildate IS NULL ) 
       AND ( inventory.discontinued = 0 ) 
       AND ( Getdate() <= CONVERT(DATE, Dateadd(month, 5, pohistory.date)) )
       AND inventory.discontinued = 0 

GROUP  BY inventory.localsku, 
          inventorysuppliers.suppliersku, 
          inventory.itemname, 
          suppliers.suppliername, 
          inventory.qoh, 
          inventory.discontinued, 
          inventory.Text2,
          inventory.Text3,
          inventory.Text5
HAVING    ( inventory.QOH > 0)
ORDER  BY suppliers.suppliername 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2020-12-05
    相关资源
    最近更新 更多