2014-02-25 117 views
0

我打印出每个州的总销售额,只要该月的销售额超过6000美元即可。结果需要按月排序(降序)。我注意到我在同一个月得到了2个得克萨斯州的结果。所以告诉我的是,只是寻找超过6,000美元的个人销售额,尽管我有一笔总额(so.total),我认为这个总额会在本月订购。不知道如何通过每个人每月以打破销售如果order_date的字段日 - 月 - 年它(使用Oracle 10g)按月订购总销售额

输入:

SELECT c.state "State",to_char(so.order_date, 'Month')"Month", sum(so.total)"Sales" 
FROM a_customer c 
JOIN a_sales_order so ON c.customer_id=so.customer_id 
GROUP BY c.state, so.order_date 
HAVING sum(so.total)>6000 
ORDER BY to_char(so.order_date, 'MM') desc 

输出:

State Month  Sales 
----- --------- -------- 
TX September $8,400 
CA July  $8,377 
TX March  $7,700 
TX March  $8,540 
CA February $46,370 
MN February $6,400 
CA February $24,650 

回答

1

我认为您的GROUP BYORDER BY子句中可能存在问题。

尝试:

SELECT c.state AS "State", 
     to_char(so.order_date, 'Month') AS "Month", 
     sum(so.total) AS "Sales" 
    FROM a_customer c 
    JOIN a_sales_order so ON c.customer_id=so.customer_id 
GROUP BY c.state, 
     to_char(so.order_date, 'Month') 
HAVING sum(so.total)>6000 
ORDER BY to_date(to_char(so.order_date, 'Month'), 'Month') desc 

我没有在我面前的工作实例,此刻尝试,但你需要确保你是分组在相同的输出您显示,在原始示例中,您在完整的order_date上进行分组,但仅显示月份部分。 在您的示例中的顺序将按月的文本排序,而不是按实际的时间顺序排列。

希望它有帮助。

+0

这工作,但我想更好地了解顺序。您将order_date更改为月份的char值,那么您将char值更改为以一个月为单位的日期值? – Student

+1

实际上,您将ORDER_DATE截断为TO_CHAR中的月份部分,如果您只是这样做了,那么订单将仅在月份字符串而不是月份值。因此,您必须再次TO_DATE才能获得按时间顺序排列的顺序。 – Ollie