Cómo obtener datos agregados y de columna de la base de datos Derby uniendo tres tablas

Necesito presentar datos de una base de datos Derby en una JTable, pero dos de las columnas son sumas agregadas de dos tablas relacionadas de uno a muchos. Aquí hay un esquema de ejemplo:

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

Hay 0 o más OTHERPAIDOUTS para un SHIFTDATA determinado

Hay 0 o más DESCUENTOS para un SHIFTDATA determinado

Necesito el equivalente de esta declaración, aunque sé que no puedo combinar expresiones agregadas con "expresiones no agregadas" en una declaración 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

Veo en otros hilos donde agregar la cláusula GROUP BY corrige estas situaciones, pero supongo que agregar el segundo agregado de una tercera tabla me está desanimando. Intenté GROUP BY S.NET_SALES, S.SALES_TAX, y agregué AND S.ID = 278 a la cláusula WHERE para obtener un resultado conocido, y TOTAL_PAIDOUTS es correcto (hay 3 registros relacionados en OTHERPAIDOUTS), pero el TOTAL_DISCOUNTS devuelto es 3 veces lo que debería ser.

¡No hace falta decir que no soy un programador de SQL! Espero que entiendas lo que busco. Intenté las instrucciones SELECT anidadas pero solo hice un desastre. Esta aplicación aún está en desarrollo, incluida la estructura de la base de datos, por lo que si una estructura de base de datos diferente simplificaría las cosas, esa podría ser una opción. O, si hay otra forma de construir mediante programación el modelo de tabla, también estoy abierto a eso. ¡¡Gracias por adelantado!!

======== Editar =============

Para verificar los valores de un registro conocido, estoy consultando un SHIFTDATA.ID específico. A continuación se muestran los registros de la tabla de muestra:

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

Lo que espero ver para esta fila SHIFTDATA en la JTable:

TOTAL_PAIDOUTS | TOTAL_DISCOUNT |NET_SALES |SALES_TAX
------------------------------------------------------
93.48          |15.91           |3898.78   |319.79

Lo mejor que puedo obtener es agregar la cláusula GROUP BY, pero al agrupar por los campos de SHIFTDATA obtengo:

TOTAL_PAIDOUTS | TOTAL_DISCOUNT |NET_SALES |SALES_TAX
------------------------------------------------------
93.48          |47.73           |3898.78   |319.79
Respuesta 1

Aquí está la consulta SQL con el resultado requerido.

Aquí están las definiciones de tabla, datos, sql y los resultados:

CREATE TABLE shiftdata (
    id int,
    foodcost int,
    officesuppl int,
    repmaint int,
    netsales int,
    salestax int);

CREATE TABLE otherpaidouts (
    id int,
    shiftid int,
    label varchar(20),
    amount int);

CREATE TABLE discounts (
    id int,
    shiftid int,
    itemname varchar(20),
    amount int);

Cree datos para dos turnos: 278 y 333. Ambos turnos tienen discounts, pero solo el turno 278 tiene el otherpaidouts.

insert into shiftdata values (278, 0, 5, 10, 3898, 319);
insert into shiftdata values (333, 22, 15, 100, 2111, 88);
insert into otherpaidouts values (37, 278, 'Food Cost FUEL', 52);
insert into otherpaidouts values (38, 278, 'Maint FUEL', 5);
insert into otherpaidouts values (39, 278, 'Empl SHOES', 21);
insert into discounts values (219, 278, 'Misc DISCOUNTS', 15);
insert into discounts values (312, 333, 'Misc DISCOUNTS', 25);


La consulta:

SELECT sd.id, sd.netsales, sd.salestax,
  IFNULL(
    (SELECT SUM(d.amount) FROM discounts d WHERE d.shiftid=sd.id), 0) AS total_discount,
  (SELECT sd.foodcost + sd.officesuppl + sd.repmaint + IFNULL(SUM(op.amount), 0) FROM otherpaidouts op WHERE op.shiftid=sd.id) AS total_paidouts
FROM shiftdata sd;


El resultado:

+------+----------+----------+----------------+----------------+
| id   | netsales | salestax | total_discount | total_paidouts |
+------+----------+----------+----------------+----------------+
|  278 |     3898 |      319 |             15 |             93 |
|  333 |     2111 |       88 |             25 |            137 |
+------+----------+----------+----------------+----------------+
Respuesta: 2

Posible duplicado: manejo de InterruptedException en Java Me pregunto cómo se debe manejar adecuadamente InterruptedException. ¿Qué acciones deben realizarse en el bloque catch? ¿Hay alguna ...

Estoy tratando de obtener datos de URL y escribirlos en un archivo, y obtuve los datos de la URL pero el archivo está vacío y debajo de mi código: public class LiveRead {public static void main (String [] args) {. ..

En mi clase estamos empezando a aprender java, nos encargaron explicar por qué este código: import java.io.IOEXception; class Inputif {public static void main (String args []) lanza java.io.IOException ...

Acceda a archivos PDF desde 'res / raw' o carpeta de activos mediante programación para analizar con los métodos dados Explicación: En este momento, este programa accede a un archivo desde un administrador de archivos que toma los archivos seleccionados ...