抱歉,我不确定如何准确地说出这个标题。
鉴于此域:
class PurchaseLog{
Date dateCreated
Date logDate // Specific day of log; not necessarily the day it was created
Branch branch
static hasMany = [itemCount: ItemCount]
}
和:
class ItemCount {
Item item
Long count
static belongsTo = [purchaseLog : PurchaseLog]
}
系统应该按天或按周获取购买日志(每件商品购买了多少)。给定每个分支的交易记录,它每天创建日志。
每天都可以轻松获取库存日志,但是,系统应合并一周内的物料计数以创建每周日志。我一直在尝试使用SQL,将
ItemCount
表与PurchaseLog
表结合在一起,然后对它们进行分组并合并每个项目的项目计数(获取每个项目每一天的计数总和)。这是我一直在尝试使用的SQL查询:
WITH purchase_log_list AS (SELECT pl.log_date, ic.item_id, ic.count, pl.branch_id FROM purchase_log AS pl LEFT JOIN item_count AS ic ON pl.id = ic.purchase_log_id )
SELECT item_id, SUM(count) AS countPerWeek, extract(YEAR FROM log_date) as year_group, extract(WEEK FROM log_date) as week_group FROM purchase_log_list WHERE branch_id = :branch_id GROUP BY year_group, week_group, item_id ORDER BY year_group, week_group
它仍然没有按预期工作,并且我已经为此工作了好几天。有什么建议吗?
最佳答案
您可以为此使用HQL
。 HQL
具有几个与日期/时间相关的功能,例如day
,dayofweek
month
,year
等。您可以将这些功能与group by一起使用,以实现所需的功能。例如,如果要针对PurchaLog.logDate
按周分组的项目总和
//Assuming Item has a name property
def logs = ItemCount.executeQuery("select item.name, purchaseLog.logDate, sum(count) from ItemCount group by item.name, dayofweek(purchaseLog.logDate)")
注1:这将返回列表列表,而不是
ItemCount
列表。注2:每次在选定的列中使用
aggregate
函数时,都必须明确提及要在查询中使用的字段名称,并且该字段类型不能属于其他域。就像如果您想从Item
中获取ItemCount
一样,您需要提及Item
的字段名称,例如select item.name ...
。您不能只提及select item ...
。这是HQL Doc和Grails executeQuery的链接。但是,我在HQL文档中找不到
dayofweek
。但是它受HQL支持,我已经使用过。这是一条提及此can we group by day of the week using hibernate?的帖子关于sql - Grails-通过分组和汇总域中的几个元素来检索数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32941920/