Я борюсь со следующей проблемой, буду благодарен за любую помощь! Мне нужно взять суммирование переменной но уровня группы по зависимостям от условия (см. 3.), это выходит за рамки моих знаний SQL.
Итак, мой запрос должен:
Мой вымышленный набор данных выглядит так (скрипт для воссоздания см. внизу):
И окончательный результат запроса должен быть таким:
Спасибо вам всем!
Я пробовал использовать много разных операторов with, чтобы сделать это шаг за шагом, но без правильного результата. Используя оператор with, я могу объединить шаги 1 и 2, сначала суммируя по идентификатору и SPLIT, а затем объединяясь на основе самого последнего значения CUST VALUE, но это соединение является моей проблемой, поскольку оно делает шаг 3 невозможным.
WITH LatestDatePerID AS (
SELECT ID,
"SPLIT",
MAX(DATE_COLUMN) AS MAX_DATE
FROM your_table_name
GROUP BY ID, "SPLIT"
),
LatestCustPerID AS (
SELECT t.ID,
t.CUST,
t."SPLIT",
t.DATE_COLUMN,
t.AMOUNT
FROM your_table_name t
JOIN LatestDatePerID l ON t.ID = l.ID AND t.DATE_COLUMN = l.MAX_DATE and t."SPLIT" = l."SPLIT"
)
SELECT ID,
CUST,
"SPLIT",
DATE_COLUMN,
SUM(AMOUNT) AS AMOUNT
FROM LatestCustPerID
GROUP BY ID, "SPLIT", CUST, DATE_COLUMN
ORDER BY ID, DATE_COLUMN DESC;
Таким образом, он не суммирует другие игнорируемые строки. Я ломаю голову над этим.
Скрипт для воссоздания таблицы:
CREATE TABLE Test_Table_MM (
ID VARCHAR2(10),
SPLIT VARCHAR2(10),
CUST VARCHAR2(10),
DATE_COLUMN DATE,
AMOUNT NUMBER
);
INSERT INTO Test_Table_MM (ID, SPLIT, CUST, DATE_COLUMN, AMOUNT) VALUES ('ID_1', 'SPLIT_YES', 'A', TO_DATE('05/01/2024', 'MM/DD/YYYY'), 100);
INSERT INTO Test_Table_MM (ID, SPLIT, CUST, DATE_COLUMN, AMOUNT) VALUES ('ID_1', 'SPLIT_NO', 'A', TO_DATE('04/01/2024', 'MM/DD/YYYY'), 200);
INSERT INTO Test_Table_MM (ID, SPLIT, CUST, DATE_COLUMN, AMOUNT) VALUES ('ID_1', 'SPLIT_YES', 'B', TO_DATE('03/01/2024', 'MM/DD/YYYY'), 50);
INSERT INTO Test_Table_MM (ID, SPLIT, CUST, DATE_COLUMN, AMOUNT) VALUES ('ID_2', 'SPLIT_YES', 'A', TO_DATE('05/01/2024', 'MM/DD/YYYY'), 50);
INSERT INTO Test_Table_MM (ID, SPLIT, CUST, DATE_COLUMN, AMOUNT) VALUES ('ID_2', 'SPLIT_NO', 'A', TO_DATE('04/01/2024', 'MM/DD/YYYY'), 300);
INSERT INTO Test_Table_MM (ID, SPLIT, CUST, DATE_COLUMN, AMOUNT) VALUES ('ID_2', 'SPLIT_NO', 'B', TO_DATE('03/01/2024', 'MM/DD/YYYY'), 300);
INSERT INTO Test_Table_MM (ID, SPLIT, CUST, DATE_COLUMN, AMOUNT) VALUES ('ID_3', 'SPLIT_YES', 'B', TO_DATE('04/01/2024', 'MM/DD/YYYY'), 90);
INSERT INTO Test_Table_MM (ID, SPLIT, CUST, DATE_COLUMN, AMOUNT) VALUES ('ID_3', 'SPLIT_NO', 'B', TO_DATE('04/01/2024', 'MM/DD/YYYY'), 30);
INSERT INTO Test_Table_MM (ID, SPLIT, CUST, DATE_COLUMN, AMOUNT) VALUES ('ID_3', 'SPLIT_NO', 'A', TO_DATE('04/01/2024', 'MM/DD/YYYY'), 10);
INSERT INTO Test_Table_MM (ID, SPLIT, CUST, DATE_COLUMN, AMOUNT) VALUES ('ID_3', 'SPLIT_NO', 'A', TO_DATE('03/01/2024', 'MM/DD/YYYY'), 10);
Извиняюсь, не очень разбираюсь в публикации. Я добавил скрипт для воссоздания данных примера, в котором также исправил ошибку А и Б.


Вы можете использовать аналитические функции:
SELECT id,
split,
cust,
date_column,
CASE num_cust
WHEN 1
THEN total_amount
ELSE total_cust_amount
END AS amount
FROM (
SELECT t.*,
COUNT(DISTINCT CASE rnk WHEN 1 THEN cust END)
OVER (PARTITION BY id, split) AS num_cust
FROM (
SELECT t.*,
DENSE_RANK() OVER (PARTITION BY id, split ORDER BY date_column DESC) AS rnk,
SUM(amount) OVER (PARTITION BY id, split) AS total_amount,
SUM(amount) OVER (PARTITION BY id, split, cust) AS total_cust_amount
FROM test_table_mm t
) t
WHERE rnk = 1
)
Что для примера данных выводит:
Пожалуйста, отредактируйте вопрос и включите минимальный воспроизводимый пример с: утверждениями
CREATE TABLEиINSERTдля вашего образца данных (в виде текста, который мы можем скопировать/вставить и выполнить, а НЕ изображений); подробное объяснение проблемы; и ожидаемый результат (опять же, в виде текста, а не изображений). Вам нужно объяснить, почему выходные данные выглядят так, потому что если выGROUP BY id, split, то дляid_1/SPLIT_NOcustбудетA, а неB, и дата также не совпадает.