我在SQL Developer上练习OE架构数据库,我无法弄清楚如何解决这个问题。我试图获得由州和年/月汇总的客户总支出。
我的sql代码:
SELECT
c.cust_address.state_province,
SUM(o.order_total) AS Total_of_Sales,
TO_CHAR(o.order_date, 'YYYY-MM') AS Year_Month
FROM
oe.customers c,
oe.orders o
WHERE
c.customer_id = o.customer_id
GROUP BY
c.cust_address.state_province,
o.order_date
ORDER BY
o.order_date;
查询结果:
[]
但是,正如您在此处所见,状态和年/月的数据仍未分组。相反,它们在同一个月的每个州都有3行,我需要将它们相加为一个。
有人可以指导我如何纠正我的代码以获得我想要的结果吗?
答案 0 :(得分:0)
首先,从不在FROM
子句中使用逗号。 始终使用正确的,明确的JOIN
语法。如果您正在学习SQL,这一点就更为重要。不要学习坏习惯!
您需要按Year_Month
表达式进行汇总:
SELECT c.cust_address.state_province,
SUM(o.order_total) AS Total_of_Sales,
TO_CHAR(o.order_date, 'YYYY-MM') AS Year_Month
FROM oe.customers c JOIN
oe.orders o
ON c.customer_id = o.customer_id
GROUP BY c.cust_address.state_province, TO_CHAR(o.order_date, 'YYYY-MM')
ORDER BY TO_CHAR(o.order_date, 'YYYY-MM');
在某些数据库中,您可以使用Year_Month
中的列别名(GROUP BY
)。 Oracle不是这些数据库之一。
答案 1 :(得分:0)
你应该使用Year_Month ... TO_CHAR(o.order_date,' YYYY-MM')in ..(和order by)
SELECT c.cust_address.state_province,
SUM(o.order_total) AS Total_of_Sales,
TO_CHAR(o.order_date, 'YYYY-MM') AS Year_Month
FROM oe.customers c,
oe.orders o
WHERE c.customer_id = o.customer_id
GROUP BY c.cust_address.state_province, TO_CHAR(o.order_date, 'YYYY-MM')
ORDER BY TO_CHAR(o.order_date, 'YYYY-MM');
否则您获得与o.order_date相同的粒度