Sql 我不能让它显示每月的信息。是GROUP BY还是my LOOP';怎么搞砸了?

Sql 我不能让它显示每月的信息。是GROUP BY还是my LOOP';怎么搞砸了?,sql,oracle,plsql,group-by,Sql,Oracle,Plsql,Group By,我需要按月显示每个付款方式使用的金额 例如: JANUARY RENTALS CASH $300 VISA $200 TOTAL: $500 我尝试过许多不同的GROUPBY语句,也尝试过DISTINCE语句,但我一直得到错误“不是GROUPBY表达式”。 代码(没有GROUP BY表达式)显示重复相同月份的长列表。我不知道问题是否出在分组上,或者我是如何设置循环的 注:所有数据均来自同一年,但日期格式为2004年12月16日 代

我需要按月显示每个付款方式使用的金额

例如:

    JANUARY RENTALS
         CASH    $300
         VISA    $200
    TOTAL: $500
我尝试过许多不同的GROUPBY语句,也尝试过DISTINCE语句,但我一直得到错误“不是GROUPBY表达式”。 代码(没有GROUP BY表达式)显示重复相同月份的长列表。我不知道问题是否出在分组上,或者我是如何设置循环的

注:所有数据均来自同一年,但日期格式为2004年12月16日 代码如下:

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

这是使用正确的
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;
你想做什么还不清楚。您有
分组依据
,没有聚合函数,因此这是可疑的。一些可能性:

  • 您不打算进行聚合查询。因此,删除
    分组依据
  • 你想要每月一排。在其他列上使用聚合函数
  • 您需要每月一行和付款方式。在租赁费上使用聚合功能
  • 还有别的

这是使用正确的
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;
你想做什么还不清楚。您有
分组依据
,没有聚合函数,因此这是可疑的。一些可能性:

  • 您不打算进行聚合查询。因此,删除
    分组依据
  • 你想要每月一排。在其他列上使用聚合函数
  • 您需要每月一行和付款方式。在租赁费上使用聚合功能
  • 还有别的

您不需要将月份编号转换为月份名称的功能,而且您没有生成总数。我猜你想要的是:

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

您不需要将月份编号转换为月份名称的功能,而且您没有生成总数。我猜你想要的是:

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

用您正在使用的数据库标记您的问题。示例数据和所需结果将有所帮助。请使用您正在使用的数据库标记您的问题。样本数据和预期结果将有所帮助。