几天前我开始发布一些关于此事的消息,当时我认为通过阅读一些建议的帖子我可能找到了一个很好的解决方案。不幸的是,我们今天发现存在一些数据缺口。据我所知,这是由于查询。
我正试图获取一年的物品消费数据。如果他们全年多次购买,那么我将他们分组并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
)一批交易相关,而不是整个表。
答案 0 :(得分:0)
我猜这是算术符合日期的问题。我将HAVING datePurchase > (MAX(datePurchase) - INTERVAL 1 YEAR)
更改为HAVING datePurchase > (MAX(datePurchase) - DATE_SUB(MAX(datePurchase), INTERVAL 1 YEAR))
并瞧!