对按日期分组的值列的SUM进行排序

时间:2017-07-31 11:27:30

标签: mysql join sum union rank

我有一个查询,我想添加一个排名列。我现有的查询有三个表作为联合查询,其中包含该周的总订单值的总和。此查询生成该周的总订单值的总和,按WeekCommencing分组,但是我很难根据该周的最高到最低总值添加排名列。

我的(更新的)SQLFiddle示例在这里http://sqlfiddle.com/#!9/f1d43/35

CREATE和INSERT语句:

CREATE TABLE IF NOT EXISTS ORD (
    WeekCommencing DATE,
    Value DECIMAL(20 , 6 ),
    Orders INT(6)
);
CREATE TABLE IF NOT EXISTS REF (
    WeekCommencing DATE,
    Value DECIMAL(20 , 6 ),
    Orders INT(6)
);
CREATE TABLE IF NOT EXISTS SOH (
    WeekCommencing DATE,
    Value DECIMAL(20 , 6 ),
    Orders INT(6)
);

INSERT INTO ORD (WeekCommencing, Value, Orders) VALUES 
('2017-07-24',1,1),
('2017-07-31',2,1),
('2017-07-17',3,1);

INSERT INTO REF (WeekCommencing, Value, Orders) VALUES 
('2017-07-24',4,1),
('2017-07-17',5,1),
('2017-07-31',6,1);

INSERT INTO SOH (WeekCommencing, Value, Orders) VALUES 
('2017-07-17',7,1),
('2017-07-24',8,1),
('2017-07-31',9,1);

我迄今为止的最大努力:

SELECT 
    WeekCommencing,
    SUM(Value) AS 'TotalValue',
    SUM(Orders) AS 'Orders',
    @r:=@r+1 As 'Rank'
 FROM
    (SELECT 
        WeekCommencing, Value, Orders
    FROM
        ORD
    GROUP BY WeekCommencing UNION ALL SELECT 
        WeekCommencing, Value, Orders
    FROM
        REF
    GROUP BY WeekCommencing UNION ALL SELECT 
        WeekCommencing, Value, Orders
    FROM
        SOH
    GROUP BY WeekCommencing) t1,  
    (SELECT @r:=0) Rank
GROUP BY WeekCommencing DESC;

我的尝试目前按照开始的顺序排列,而不是排名从最高到最低。

我想要的结果是

WeekCommencing TotalValue   Orders  Rank
2017-07-31        17           3      1
2017-07-24        13           3      3
2017-07-17        15           3      2

谢谢是提前

1 个答案:

答案 0 :(得分:0)

SELECT a.*
     , @i:=@i+1 rank
  FROM 
     ( SELECT weekcommencing
            , SUM(value) totalvalue
            , COUNT(*) totalorders
         FROM 
            ( SELECT weekcommencing, value, orders FROM ord
              UNION ALL
              SELECT weekcommencing, value, orders FROM ref
              UNION ALL
              SELECT weekcommencing, value, orders FROM soh
            ) x
        GROUP
           BY weekcommencing
     ) a
     , (SELECT @i:=0) vars
 ORDER
    BY totalvalue DESC;