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')
用您正在使用的数据库标记您的问题。示例数据和所需结果将有所帮助。请使用您正在使用的数据库标记您的问题。样本数据和预期结果将有所帮助。