2017-02-10 88 views
1

我正在与SQL Developer的OE模式数据库一起练习,我无法弄清楚如何解决这个问题。我试图获得由国家和年/月总结的客户总消费。如何使用查询汇总Oracle SQL Developer中的数据?

我的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; 

查询的结果:

[Result of query]

然而,正如你可以在这里看到,国家和年/月的数据仍然不分组。相反,他们在同一个月的每一年有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'); 

在一些数据库中,你可以在GROUP BY使用列别名(Year_Month)。 Oracle不是这些数据库之一。

+0

我的最后一位教授教我如何在我的sql代码中使用JOIN和ON,但我的新教授笔记甚至没有包含任何这样的内容,只是困惑于要遵循哪种方式。此外,他在笔记中的所有查询都使用逗号,这就是为什么即时通讯遵循这种方式,但感谢您的提示和回答我的问题。我会尝试让它现在工作 –

+1

显式的'JOIN'语法是在近25年前的ANSI-92标准中引入的。也许是时候让你的教授回去上学了。 –

+1

@KurtLee - 很抱歉,你的教授已经落伍了。我希望你不要付太多钱来聘请这样的教授。 – mathguy

0

应该通过组使用YEAR_MONTH ... TO_CHAR(o.order_date, 'YYYY-MM')。(和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

+0

@mathguy correct ..answer updated .. – scaisEdge