Oracle SQL не является группой по выражению - PullRequest
0 голосов
/ 14 декабря 2018

Когда я запускаю этот код

SELECT sales_date AS DAY, SUM (TOTAL_AMOUNT_RM) 

FROM SALESINVOICE

GROUP BY SALES_DATE

order by sales_date;

, он дает мне таблицу, введите описание изображения здесь

Затем я запускаю другой код

SELECT SR.DAY, SUM(SR.PROFIT_RM) AS TOTALPROFIT_RM

FROM

(SELECT SALESINVOICE_ID AS NO, S.ITEM_ID AS ITEM, SALES_DATE AS DAY, S.QUANTITY, C.PRICE_RM, C.COST_RM, ((S.QUANTITY*C.PRICE_RM)-(S.QUANTITY*C.COST_RM)) AS PROFIT_RM

FROM SALESINVOICE S

INNER JOIN (SELECT ITEM_ID, PRICE_RM, COST_RM FROM ITEM I ) C

ON S.ITEM_ID = C.ITEM_ID
ORDER BY SALESINVOICE_ID, SALES_DATE) SR 
GROUP BY SR.DAY

ORDER BY SR.DAY;

, который дал мне таблицу введите описание изображения здесь

Я пытаюсь объединить обе таблицы, но когда я пытаюсь вызвать столбец sum (total_amount_rm), он дает мнеошибка группировки по выражению

SELECT SR.DAY, SUM(SR.PROFIT_RM) AS TOTALPROFIT_RM, D.TOTAL

FROM 

(SELECT SALESINVOICE_ID AS NO, S.ITEM_ID AS ITEM, SALES_DATE AS DAY, S.QUANTITY, C.PRICE_RM, C.COST_RM, ((S.QUANTITY*C.PRICE_RM)-(S.QUANTITY*C.COST_RM)) AS PROFIT_RM

FROM SALESINVOICE S

INNER JOIN (SELECT ITEM_ID, PRICE_RM, COST_RM FROM ITEM I ) C
ON S.ITEM_ID = C.ITEM_ID
ORDER BY SALESINVOICE_ID, SALES_DATE) SR

INNER JOIN (SELECT SALES_DATE AS DAY, SUM(TOTAL_AMOUNT_RM) AS TOTAL FROM SALESINVOICE GROUP BY SALES_DATE ORDER BY SALES_DATE) D

ON D.DAY = SR.DAY

GROUP BY SR.DAY

ORDER BY SR.DAY;

Однако она может работать без выбора D.TOTAL.Может кто-нибудь мне помочь?Я новичок sql

1 Ответ

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

Вы получаете ошибку, потому что с GROUP BY в предложении SELECT все столбцы, не входящие в предложение GROUP BY, должны поставляться с агрегатной функцией

Для ее решения одним из способов является вычислениесумма до присоединения

SELECT s.day, s.totalprofit_rm, d.total
FROM 
(
    SELECT sr.day, 
        SUM(sr.profit_rm) AS totalprofit_rm
    FROM
    (
        SELECT salesinvoice_id AS no, 
            s.item_id AS item, 
            sales_date AS day, 
            s.quantity, 
            c.price_rm, 
            c.cost_rm, 
            (s.quantity * c.price_rm) - (s.quantity * c.cost_rm) AS profit_rm
        FROM salesinvoice s
        INNER JOIN (SELECT item_id, price_rm, cost_rm FROM item) c
        ON s.item_id = c.item_id
    ) sr
    GROUP BY sr.day
) s
INNER JOIN 
(
    SELECT sales_date AS day, 
        SUM(total_amount_rm) AS total 
    FROM salesinvoice 
    GROUP BY sales_date
) d
ON d.day = s.day
ORDER BY s.day;

И этот запрос можно переписать, чтобы он был короче:

SELECT sr.day, sr.totalprofit_rm, d.total
FROM 
(
    SELECT 
        s.sales_date AS day, 
        SUM((s.quantity * c.price_rm) - (s.quantity * c.cost_rm)) AS totalprofit_rm
    FROM salesinvoice s
    INNER JOIN item c
    ON s.item_id = c.item_id
    GROUP BY s.sales_date  
) sr
INNER JOIN 
(
    SELECT sales_date AS day, 
        SUM(total_amount_rm) AS total 
    FROM salesinvoice 
    GROUP BY sales_date
) d
ON d.day = sr.day
ORDER BY sr.day;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...