2014-05-04 48 views
1

这里我在第一列显示订单的年份,第二个月显示Order_id,第三个显示Order_id。我想按月份,按年份和总计显示总计。WITH ROLLUP无法正常工作

这是我想要得到的结果:

enter image description here

月总,总年和总计。

这里是我的查询:

SELECT coalesce(extract(year FROM order_date), 'Grand Total') as 'Year' 
    , CASE when extract(year FROM order_date) is null then ' ' 
     when extract(month FROM order_date) is null then 'Year total' 
     else extract(month FROM order_date) 
    END as `Month` 
    , CASE when extract(month FROM order_date) is null Then ' ' 
     else coalesce(oh.order_id, 'Month Total') 
    END as 'Order ID' 
    , sum(quantity * order_price) AS 'AmntDue' 
    , sum(quantity) AS 'NumBooksPurch' 
FROM a_bkorders.order_headers oh 
JOIN a_bkorders.order_details od on oh.order_id = od.order_id 
GROUP BY extract(year FROM order_date), extract(month FROM order_date), oh.order_id with rollup 
; 

但是,这是我得到:

enter image description here

月份总似乎很好地工作,但不是每年总或共展宏图。我无法理解我做错了什么。

+0

你可以发布一个数据样本,供我们用小提琴重现结果吗? –

+0

当然,我在这个链接上附加了数据库a_bkorders.order_headers的.sql文件:https://drive.google.com/file/d/0B8bvMX0U7f71SFFUR0RaTkVhOTA/edit?usp=sharing –

+0

所以我知道问题在哪里,但我不完全确定解决方案是什么。我现在正在处理它......基本上,汇总只会被应用到你的order_id列..所以你正在得到你想要的结果......只是通过搞乱我得到了1总计和3年总计结果,然后是月总计,但它不正确,所以我会看看我能做些什么..但我不是一个MySQL专家,所以我可以引用别人来解决这个问题,如果我无法弄清楚: ) –

回答

2

我不能保证这会工作,因为我没有所有的数据(又名第二张表的订单金额)..但我认为这样的事情会起作用。让我知道,如果它昏昏欲睡。

SELECT 
    Year, 
    IF(Year = 'Grand Total', ' ', Month), 
    IF(Month = 'Year Total' OR Year = 'Grand Total', ' ', Ordered_ID), 
    AmntDue, 
    NumberOfBooksPurch 
FROM(
    SELECT 
     COALESCE(Year, 'Grand Total') AS Year, 
     CASE 
      WHEN Year IS NULL THEN ' ' 
      ELSE COALESCE(MONTH, 'Year Total') 
     END AS Month, 
     Ordered_ID, 
     AmntDue, 
     NumberOfBooksPurch 
    FROM (
     SELECT 
      YEAR(order_date) AS Year, 
      MONTH(order_date) AS Month, 
      CASE 
       WHEN MONTH(order_date) IS NULL THEN ' ' 
       ELSE COALESCE(order_id, 'Month Total') 
      END as Ordered_ID, 
      SUM(quantity * order_price) AS AmntDue, 
      COUNT(order_id) AS NumberOfBooksPurch 
     FROM a_bkorders.order_headers 
     JOIN a_bkorders.order_details USING (order_id) 
     GROUP BY Year, Month, order_id WITH ROLLUP 
    ) temp_table_alias 
) final_temp_table; 
+0

这实际上不会产生你想要的一切...给我一秒..我会更新,所以它把正确的行的空值 –

+1

你做了什么作品完美无瑕,谢谢!那么这是否意味着我有多个表涉及到汇总时必须使用子查询?我的方式怎么不起作用? –

+0

与汇总是一个非常棘手的运算符......当你有多个行你想汇总一个子查询,所以它会适用于所有。我刚刚更新了正确的查询,应该返回您要求的预期结果 –