【发布时间】:2019-05-05 17:26:02
【问题描述】:
我需要在 JTable 中显示来自 Derby 数据库的数据,但其中两列是来自两个一对多相关表的汇总和。以下是示例架构:
SHIFTDATA:
ID
DATE
SHIFT
FOOD_COST
OFFICE_SUPPLIES
REP_MAINT
NET_SALES
SALES_TAX
OTHERPAIDOUTS:
ID
SHIFTDATA_ID
LABEL
AMOUNT
DISCOUNTS
ID
SHIFTDATA_ID
DISCOUNT_NAME
AMOUNT
给定的 SHIFTDATA 有 0 个或多个 OTHERPAIDOUTS
给定的 SHIFTDATA 有 0 个或多个折扣
我需要这个语句的等价物,虽然我知道我不能在 SELECT 语句中将聚合表达式与“非聚合表达式”结合起来:
SELECT (S.FOOD_COST + S.OFFICE_SUPPLIES + S.REP_MAINT + SUM(O.AMOUNT)) AS TOTAL_PAIDOUTS,
SUM(D.AMOUNT) AS TOTAL_DISCOUNT,
S.NET_SALES,
S.SALES_TAX
FROM SHIFTDATA S, OTHERPAIDOUTS O, DISCOUNTS D WHERE O.SHIFTDATA_ID=S.ID AND D.SHIFTDATA_ID=S.ID
我在其他线程中看到添加 GROUP BY 子句可以解决这些情况,但我想从第三个表中添加第二个聚合会让我失望。我尝试了GROUP BY S.NET_SALES、S.SALES_TAX,并在WHERE子句中加入AND S.ID = 278得到已知结果,TOTAL_PAIDOUTS正确(OTHERPAIDOUTS中有3条相关记录),但返回的TOTAL_DISCOUNTS为应该是3倍。
不用说,我不是 SQL 程序员!希望你能明白我所追求的要点。我尝试了嵌套的 SELECT 语句,但只是把它弄得一团糟。这个应用程序仍在开发中,包括数据库结构,所以如果不同的数据库结构可以简化事情,那可能是一个选择。或者,如果有另一种以编程方式构建表模型的方法,我也对此持开放态度。提前致谢!!
========编辑=============
为了检查已知记录中的值,我使用特定的 SHIFTDATA.ID 进行查询。以下是示例表记录:
SHIFTDATA:
ID |FOOD_COST |OFFICE_SU&|REP_MAINT |NET_SALES |SALES_TAX
------------------------------------------------------
278 |0.00 |5.00 |10.00 |3898.78 |319.79
OTHERPAIDOUTS:
ID |SHIFTDATA_&|LABEL |AMOUNT
---------------------------------------------------------------------------
37 |278 |FOOD COST FUEL |52.00
38 |278 |MAINT FUEL |5.00
39 |278 |EMPLOYEE SHOES |21.48
DISCOUNTS:
ID |ITEM_NAME |SHIFTDATA_&|AMOUNT
---------------------------------------------------------------------------
219 |Misc Discounts |278 |15.91
我希望在 JTable 中看到这个 SHIFTDATA 行:
TOTAL_PAIDOUTS | TOTAL_DISCOUNT |NET_SALES |SALES_TAX
------------------------------------------------------
93.48 |15.91 |3898.78 |319.79
我能得到的最好的方法是添加 GROUP BY 子句,但按我得到的 SHIFTDATA 字段分组:
TOTAL_PAIDOUTS | TOTAL_DISCOUNT |NET_SALES |SALES_TAX
------------------------------------------------------
93.48 |47.73 |3898.78 |319.79
【问题讨论】:
-
你能举一个输入表数据的例子 - 和 - 在
JTable中显示的输出吗? -
我将编辑我的 OP,因为我的评论长度有限。
-
当然,。您可以在帖子底部添加它!
-
您是如何得出
93.48对应TOTAL_PAIDOUTS的值的? -
这是 S.FOOD_COST + S.OFFICE_SUPPLIES + S.REP_MAINT + SUM(O.AMOUNT) AS TOTAL_PAIDOUTS 的结果