【发布时间】:2019-08-05 14:42:03
【问题描述】:
我有一个查询要从表的组合中返回各种数字。我正在使用 jooq 运行此查询。
final SiteSalesFigures siteSalesFigures =
dsl.select(
countDistinct(LINE.TRANSACTION_ID).as("transactionCount"),
sum(LINE.PROFIT).as("totalProfit"),
sum(LINE.TOTAL).as("totalSalesAmount"),
sum(LINE.QUANTITY).as("totalItemsSold"),
sum(LINE.PROFIT).divide(sum(LINE.TOTAL)).multiply(100).as("profitMarginPercentage"),
avg(TRANSACTIONS.NO_OF_ITEMS).as("averageItemsPerTransaction"),
sum(LINE.TOTAL).divide(countDistinct(LINE.TRANSACTION_ID)).as("averageSalesTotalPerTransaction"),
sum(LINE.PROFIT).divide(countDistinct(LINE.TRANSACTION_ID)).as("averageProfitTotalPerTransaction"))
.from(TRANSACTIONS)
.join(LINE).on(TRANSACTIONS.TRANSACTION_ID.equal(LINE.TRANSACTION_ID))
.leftJoin(ITEM).on(LINE.ITEM_ID.equal(ITEM.ITEM_CODE))
.where(TRANSACTIONS.SITE_ID.equal(siteId))
.and(TRANSACTIONS.NO_OF_LINES.greaterThan(0))
.and(TRANSACTIONS.START_TIME
.between(new Timestamp(reportStartDate.toInstant().toEpochMilli()))
.and(new Timestamp(reportEndDate.toInstant().toEpochMilli())))
.and(TRANSACTIONS.TRANSACTION_TYPE_ID.notEqual(cancelledSaleID))
.fetchOneInto(SiteSalesFigures.class);
averageItemsPerTransaction 被证明是问题所在。我完全理解为什么它不起作用,但我不确定如何使它起作用。不幸的是,由于使用 Line 表的排除,连接是必要的。
如果一个事务有 3 行,那么事务详细信息(包括 no_of_items)会被复制 3 次,这会导致值不正确。
我知道正确的值,因为我只对事务表运行了 average(no_of_items) 查询。
这只是两个事务的表格(隐藏此示例不需要的列):
**transaction_id** **no_of_lines no_of_items**
8abf1720-51f6-a1bf-4714-004b644cb99f --- 2 --- 2
8abf1720-51f6-a1bf-4714-004b644cb99f --- 2 --- 2
d239feab-38ea-7c8a-4814-7d5a38f74949 --- 3 --- 4
d239feab-38ea-7c8a-4814-7d5a38f74949 --- 3 --- 4
d239feab-38ea-7c8a-4814-7d5a38f74949 --- 3 --- 4
您会注意到行数并不总是等于项目数(例如,一行可以让一个项目扫描两次)
有人有解决办法吗?
【问题讨论】:
-
您使用的是哪个 MySQL 版本? 8个还是小于8个?
-
@LukasEder 我使用的是 MySQL 8.0.13 版!