Как получить статистические данные и данные столбцов из базы данных Derby, объединяющей три таблицы - PullRequest
0 голосов
/ 04 декабря 2018

Мне нужно представить данные из базы данных Derby в JTable, но два столбца представляют собой совокупные суммы из двух связанных таблиц «один ко многим».Вот пример схемы:

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

Существует 0 или более OTHERPAIDOUTS для данного SHIFTDATA

Для данного SHIFTDATA * 06 или более СКИДОК

Мне нужен эквивалентэтого оператора, хотя я знаю, что не могу объединить агрегатные выражения с «неагрегированными выражениями» в операторе 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 и добавить AND S.ID = 278 в предложение WHERE, чтобы получить известный результат, и 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

Что я ожидаю увидеть для этой строки SHIFTDATA в JTable:

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

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вот запрос SQL с требуемым результатом.

Вот определения таблиц, данные, sql и результаты:

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);

Создание данных для двух смен: 278 и 333.Обе смены имеют discounts, но только 278 смен имеют 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);


Запрос:

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;


Результат:

+------+----------+----------+----------------+----------------+
| id   | netsales | salestax | total_discount | total_paidouts |
+------+----------+----------+----------------+----------------+
|  278 |     3898 |      319 |             15 |             93 |
|  333 |     2111 |       88 |             25 |            137 |
+------+----------+----------+----------------+----------------+
0 голосов
/ 04 декабря 2018

Попробуйте LEFT OUTER JOIN, как-то так:

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
LEFT JOIN OTHERPAIDOUTS AS O ON O.SHIFTDATA_ID = S.ID
LEFT JOIN DISCOUNTS AS D     ON D.SHIFTDATA_ID = S.ID

Редактировать

SELECT S.FOOD_COST + S.OFFICE_SUPPLIES + S.REP_MAINT +
       ( SELECT COALESCE(SUM(AMOUNT), 0) FROM OTHERPAIDOUTS WHERE SHIFTDATA_ID = S.ID ) AS TOTAL_PAIDOUTS,
       ( SELECT COALESCE(SUM(AMOUNT), 0) FROM DISCOUNTS     WHERE SHIFTDATA_ID = S.ID ) AS TOTAL_DISCOUNT,
       S.NET_SALES,
       S.SALES_TAX
FROM SHIFTDATA S
...