Я не могу заставить его отображать информацию по месяцам. Это испортили GROUP BY или мой L OOP? - PullRequest
0 голосов
/ 16 февраля 2020

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

ПРИМЕР:

    JANUARY RENTALS
         CASH    $300
         VISA    $200
    TOTAL: $500

Я пробовал много разных операторов GROUP BY и пробовал DISTINCT, но продолжаю получать ошибку "NOT A GROUP BY EXPRESSION". Код (без выражения GROUP BY) отображает длинный список, который повторяется в те же месяцы. Я не знаю наверняка, является ли проблема даже в GROUP BY или в том, как у меня настроен L OOP.

ПРИМЕЧАНИЕ. Все данные относятся к одному году, но дата в формате 16-DE C -04 Это код:

SET SERVEROUTPUT ON;

CREATE OR REPLACE FUNCTION NameMonth (MonthNum INT) 
        RETURN VARCHAR2 AS
        Month_Name VARCHAR2(9) := 'Default';
    BEGIN
        CASE
        WHEN MonthNum = 1 THEN  Month_Name := 'January';
        WHEN MonthNum = 2 THEN  Month_Name := 'February';
        WHEN MonthNum = 3 THEN  Month_Name := 'March';
        WHEN MonthNum = 4 THEN  Month_Name := 'April';
        WHEN MonthNum = 5 THEN  Month_Name := 'May';
        WHEN MonthNum = 6 THEN  Month_Name := 'June';
        WHEN MonthNum = 7 THEN  Month_Name := 'July';
        WHEN MonthNum = 8 THEN  Month_Name := 'August';
        WHEN MonthNum = 9 THEN  Month_Name := 'September';
        WHEN MonthNum = 10 THEN  Month_Name := 'October';
        WHEN MonthNum = 11 THEN  Month_Name := 'November';
        WHEN MonthNum = 12 THEN  Month_Name := 'December';
        END CASE;

        RETURN Month_Name;
    END;
 /   

 DECLARE 
    CURSOR cNameOfMonth IS
        SELECT NameMonth(EXTRACT(MONTH FROM RENTAL.RENTDATE)) AS RentMonth, RENTAL.PAYMENTMETHOD, RENTITEM.RENTFEE
        FROM ALLPOWDER.RENTAL, ALLPOWDER.RENTITEM
        WHERE RENTAL.RENTID = RENTITEM.RENTID
        GROUP BY EXTRACT(MONTH FROM RENTAL.RENTDATE) 
   -- I've also tried NameMonth(EXTRACT(MONTH FROM RENTAL.RENTDATE)) and just RENTAL.RENTDATE
        ORDER BY RentMonth;

    Rental_Rec cNameOfMonth%ROWTYPE;

BEGIN
    OPEN cNameOfMonth;
    LOOP
        FETCH cNameOfMonth INTO Rental_Rec;
        EXIT WHEN cNameOfMonth%NOTFOUND;

        DBMS_OUTPUT.NEW_LINE;
        DBMS_OUTPUT.PUT_LINE(Rental_Rec.RentMonth || ' Rentals ----------------');
    END LOOP;
    CLOSE cNameOfMonth;
END; 
/

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Ваша функция для перевода номера месяца в название месяца не нужна, и вы не генерируете общее количество. Я подозреваю, что вы хотели что-то вроде:

SELECT INITCAP(TO_CHAR(TRUNC(r.RENTDATE, 'MONTH'), 'MONTH')) AS RENTMONTH,
       INITCAP(r.PAYMENTMETHOD) AS PAYMENTMETHOD,
       SUM(i.RENTFEE) AS TOTAL_RENTFEE
  FROM ALLPOWDER.RENTAL r
  INNER JOIN ALLPOWDER.RENTITEM i
    ON i.RENTID = r.RENTID
  GROUP BY TRUNC(r.RENTDATE, 'MONTH'),
           r.PAYMENTMETHOD
  ORDER BY TRUNC(r.RENTDATE, 'MONTH')

db <> скрипка здесь

1 голос
/ 16 февраля 2020

Это ваш запрос с правильным JOIN синтаксисом и псевдонимами таблиц. Определяются проблемные столбцы:

    SELECT NameMonth(EXTRACT(MONTH FROM R.RENTDATE)) AS RentMonth,
           R.PAYMENTMETHOD, RI.RENTFEE
-----------^  --------------^
    FROM ALLPOWDER.RENTAL R JOIN
         ALLPOWDER.RENTITEM RI
         ON R.RENTID = RI.RENTID
    GROUP BY EXTRACT(MONTH FROM R.RENTDATE) 
    ORDER BY RentMonth;

Совершенно неясно, что вы хотите сделать. У вас есть GROUP BY без функций агрегирования, так что это подозрительно. Некоторые возможности:

  • Вы не собираетесь агрегировать запрос. Так что удалите GROUP BY.
  • Вы хотите одну строку в месяц. Используйте функции агрегирования в других столбцах.
  • Требуется одна строка в месяц и способ оплаты. Используйте функцию агрегирования для RENTFEE.
  • Что-то еще.
...