几天前,我开始发布有关此内容的信息,当时我以为我应该阅读一些建议的帖子,从而找到了一个好的解决方案。不幸的是,我们今天发现有些数据缺口。据我所知这是由于查询。
我正在尝试获取一年的商品支出数据。如果一年中多次购买它们,那么我将它们分组并SUM()
数量。这样做的目的是根据发生的每笔交易获得包含所有所需信息的一行,而不是2、10或100。
问题是,我不想要今天只有一年的数据。我希望该公司的那批支出的年度价值以MAX(date)
结尾。换句话说,某产品最后一次购买是在3个月前,但是他们最近一次进行的交易/ PO才是1个月前。那么,与我们的数据相关的日期应该是1个月之前的1年之前的所有日期
这是我目前所拥有的:
SELECT id, groupId, datePurchase, vendor, venItem, item, itemDesc, uom, SUM(qtyPurchase) AS `qtyPurchase`, SUM(extPrice) AS `totalPrice`, MAX(unitPrice) AS `maxPrice`, unitPrice, code, stripped_venitem, MAX(datePurchase) as `maxDate`, SUM(extPrice) as `extPrice`, PONum
FROM transactions t
WHERE (((qtyPurchase)!=0))
GROUP BY groupId, vendor, venItem, item, itemDesc, uom
HAVING datePurchase > (MAX(datePurchase) - INTERVAL 1 YEAR);
如果删除
HAVING
部分,则会显示有问题的数据。并不是说它的日期小于规定的年份。当我删除HAVING
子句并找到我们遇到问题的产品时,maxDate
值为“ 2015-08-26”这都是导入Solr的全部内容,因此我需要在单个查询中正确处理它,而无需任何额外的技巧或处理。感谢您的见解!
编辑1:
同样值得注意的是,我无法将
HAVING datePurchase > (MAX(datePurchase) - INTERVAL 1 YEAR)
部分迁移到WHERE
子句的一部分。如果直接注入,则会引发错误invalid use of group function
,并且如果将其添加为子查询(...AND datePurchase > (SELECT MAX(datePurchase)...
),则它将使用与整个数据集相对应的MAX(datePurchase)
值,而不是与之相关的特定groupId。这也值得强调:最大日期应与每个特定实体(列为
groupId
)的交易批次有关,而不是与整个表格有关。 最佳答案
我猜这是一个算术遇到日期的问题。我将HAVING datePurchase > (MAX(datePurchase) - INTERVAL 1 YEAR)
更改为HAVING datePurchase > (MAX(datePurchase) - DATE_SUB(MAX(datePurchase), INTERVAL 1 YEAR))
,瞧!