2015-10-28 28 views
0

幾天前我開始發佈一些關於此的內容,當時我想我可能已經找到了一個很好的解決方案,這要感謝閱讀一些建議帖子。不幸的是,我們今天發現存在一些數據差距。據我所知,這是由於查詢。在MAX()分組行的日期之前過濾掉任何東西

我試圖抓住一年的項目花費數據。如果他們在一年中多次購買,那麼我將它們分組,並且它們的數量爲SUM()。這個想法是根據發生的每一個事務獲得一行所有需要的信息,而不是2,10或100。

問題是我不想從今天開始只有一年的數據。我想要一年的價值,以MAX(date)爲結尾,該公司的一批支出。換句話說,也許一款產品是在3個月前上次購買的,但他們最後一次的交易/採購訂單僅在1個月前購買。與我們的數據,那麼該日期應該從1年6個月前

這之前的一切就是我目前有:

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年8月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

難道你沒有得到一個錯誤的「desc」不包括在反引號?如果最大日期應該與每個特定實體相關,那麼您應該只有'GROUP BY groupId'。爲什麼'GROUP BY'中有很多列名? –

+0

我會的,是的,但不要BC它是我在這裏寫出來的一個mod,所以在實際查詢中是一個非問題。我無法單獨通過「groupId」進行分組,因此我們的想法是「捲起」相同的項目。如果他們在1月份購買2個foobars,5月份購買5個foobar,上個月購買4個foobar,那麼我想要一條代表購買foobar的產品線,數量爲11個。此外,真正相同的產品需要所有這些「GROUP BY '領域匹配。如果它是ABC公司的foobar和XYZ公司的foobar,那麼它不被認爲是相同的。其描述和計量單位也是如此。 –

回答

0

我猜這是一個算術符合日期問題。我將HAVING datePurchase > (MAX(datePurchase) - INTERVAL 1 YEAR)更改爲HAVING datePurchase > (MAX(datePurchase) - DATE_SUB(MAX(datePurchase), INTERVAL 1 YEAR)),瞧!