Как сложить суммированные значения из столбца, где SELECT использовал две таблицы в SQL в Oracle - PullRequest
1 голос
/ 25 апреля 2019

Я работаю над заданием, в котором мне нужно сложить некоторые значения в соответствии с их общими кодами (т. Е. Если в одной таблице есть такие значения, как

  code   |   name
---------------------
1        |   blah
2        |   blah1
3        |   blah2
1        |   blah

, а затем в таблице 2 есть

code | amount
-------------
1    | 100
2    | 200
3    | 250
1    | 125

Мне нужно сложить все значения с помощью общего кода, например, сложить суммы для обоих значений с кодом 1, суммы для значений с кодом 2 и суммы для значений с кодом3)

но тогда мне также нужно подвести все результаты.Я дошел до сложения строк с общими кодами.У меня просто возникают проблемы с суммированием итогов, или, может быть, я просто складываю все значения из столбца «суммы».Я хотел бы, чтобы это было в одном утверждении, поэтому я подумал, что было бы проще сложить отдельные суммы сумм.

Я думаю, что у меня есть идея вниз, Я просто не знаю, как на самом деле выполнить его.

Прямо сейчас у меня есть, я попробовал несколько вариантов, в том числе с помощью предложения HAVING, но все еще только что получил ошибки:

SELECT X_STORE.STORE_NAME AS "store name", SUM(X_STORE_SALES.WEEKLY_SALES) AS "total weekly sales", SUM(SUM(X_STORE_SALES.WEEKLY_SALES)) AS "grand total"
FROM X_STORE JOIN X_STORE_SALES ON X_STORE.STORE_CODE = X_STORE_SALES.STORE_CODE
GROUP BY STORE_NAME;

и вот коды для таблиц для справочных целей:

CREATE TABLE X_STORE (
  STORE_CODE integer,
  STORE_NAME varchar2(20)
);

INSERT INTO X_STORE VALUES('1','Access Junction');
INSERT INTO X_STORE VALUES('2','Database Corner');
INSERT INTO X_STORE VALUES('3','Tuple Charge');
INSERT INTO X_STORE VALUES('4','Attribute Alley');
INSERT INTO X_STORE VALUES('5','Primary Key Point');

CREATE TABLE X_STORE_SALES (
  ROW_NUMBER INT,
  STORE_CODE INT,
  WEEKLY_SALES DECIMAL(12,2),
  REGION_CODE INT
);

INSERT INTO X_STORE_SALES VALUES (1, 1, 854558.38, 1);
INSERT INTO X_STORE_SALES VALUES (2, 2, 689475.89, 1);
INSERT INTO X_STORE_SALES VALUES (3, 3, 978046.91, 1);
INSERT INTO X_STORE_SALES VALUES (4, 4, 826270.78, 1);
INSERT INTO X_STORE_SALES VALUES (5, 5, 314859.95, 1);
INSERT INTO X_STORE_SALES VALUES (6, 1, 402342.82, 2);
INSERT INTO X_STORE_SALES VALUES (7, 2, 326841.11, 2);
INSERT INTO X_STORE_SALES VALUES (8, 3, 503921.45, 2);
INSERT INTO X_STORE_SALES VALUES (9, 4, 949408.97, 2);
INSERT INTO X_STORE_SALES VALUES (10, 5, 581574.05, 2);
INSERT INTO X_STORE_SALES VALUES (11, 1, 638178.3, 3);
INSERT INTO X_STORE_SALES VALUES (12, 2, 511723.79, 3);
INSERT INTO X_STORE_SALES VALUES (13, 3, 556421.29, 3);
INSERT INTO X_STORE_SALES VALUES (14, 4, 951686.38, 3);
INSERT INTO X_STORE_SALES VALUES (15, 5, 902503.64, 3);
INSERT INTO X_STORE_SALES VALUES (16, 1, 443410.39, 4);
INSERT INTO X_STORE_SALES VALUES (17, 2, 281833.15, 4);
INSERT INTO X_STORE_SALES VALUES (18, 3, 409222.16, 4);
INSERT INTO X_STORE_SALES VALUES (19, 4, 853611.42, 4);
INSERT INTO X_STORE_SALES VALUES (20, 5, 118228.64, 4);

Ожидаемый результат будет примерно таким:

store name        | total weekly sales
--------------------------------------
Attribute Alley   |         3580977.55
--------------------------------------
Primary Key Point |         1917166.28
--------------------------------------
Database Corner   |         1809873.94
--------------------------------------
Access Junction   |         2338489.89
--------------------------------------
Tuple Charge      |         2447611.81
--------------------------------------
grand total (or   |
just null, doesn't|      12,094,119.47
really matter)    |

, но вместо этого с последней идеейчто я попытался, я получаю сообщение об ошибке, которое только говорит: ORA-00923: not a single-group group function

Одна вещь, я думаю, что я могу делать неправильно, это запрос информации, как будто она появится в новом столбце, и поэтомуиз-за этого, но я не знаю, как решить проблему, и я не знаю, что «гуглить», чтобы получить представление.

Ответы [ 3 ]

2 голосов
/ 25 апреля 2019

Вы присоединитесь к таблицам и будете использовать group by для получения сгруппированных сумм.
Затем с помощью UNION вы добавите к результатам:

select 
  t.store_name,
  sum(s.weekly_sales) total_weekly_sales
from x_store t inner join x_store_sales s
on s.store_code = t.store_code
group by t.store_code, t.store_name
union all
select 
  'grand total',
  sum(weekly_sales) total_weekly_sales
from x_store_sales

См. Демоверсию .
Или более эффективно с CTE:

with cte as (
  select 
    t.store_name,
    sum(s.weekly_sales) total_weekly_sales
  from x_store t inner join x_store_sales s
  on s.store_code = t.store_code
  group by t.store_code, t.store_name
)
select * from cte
union all
select 
  'grand total',
  sum(total_weekly_sales)
from cte
2 голосов
/ 26 апреля 2019

Если вы просто хотите получить строку с итогами, используйте grouping sets:

select s.store_name,
       sum(ss.weekly_sales) as total_weekly_sales
from x_store s inner join
     x_store_sales ss
     on ss.store_code = s.store_code
group by grouping sets ( (s.store_code, s.store_name), () );
2 голосов
/ 25 апреля 2019

Удалить общий итог.Кроме того, у вас была небольшая ошибка в вашем запросе: вы написали SUM(SUM(...)).Это недопустимо.

Если вы удалите общую сумму, она должна работать, как в:

SELECT
  X_STORE.STORE_NAME AS "store name", 
  SUM(X_STORE_SALES.WEEKLY_SALES) AS "total weekly sales"
FROM X_STORE
JOIN X_STORE_SALES ON X_STORE.STORE_CODE = X_STORE_SALES.STORE_CODE
GROUP BY STORE_NAME

Результат:

store name         total weekly sales 
-----------------  ------------------ 
Primary Key Point  1,917,166.28       
Access Junction    2,338,489.89       
Attribute Alley    3,580,977.55       
Tuple Charge       2,447,611.81       
Database Corner    1,809,873.94       
...