以h2为单位获得每月平均值,这是一年或一个月的平均值

时间:2018-04-20 00:27:43

标签: sql h2

我希望能够在一个月内获得一辆卡车消耗的平均汽油数量

SELECT t.truckCode,
COALESCE(monthname(orderDate),'Not Announced') as month,
IFNULL (avg(petrolQty),0) as avgPetrolQty
from truck t left join orderz o
on t.truckId = o.truckId
group by t.truckCode, COALESCE(monthname(orderDate),'Not Announced')
order by 1,2

并得到了这个结果

+-----------+---------------+----------------+
| TRUCKCODE |     MONTH     | AVGPETROLQTY   |
+-----------+---------------+----------------+
| BY2004    | January       |           13.0 |
| BY2354    | January       |           33.0 |
| BY2874    | January       |           13.0 |
| BY2994    | Not Announced |            0.0 |
| BY8754    | Not Announced |            0.0 |
+-----------+---------------+----------------+

这些是我的表

DROP TABLE IF EXISTS truck;
CREATE TABLE truck (
  truckId INT NOT NULL AUTO_INCREMENT,
  truckCode VARCHAR(255) NOT NULL,
  purchasedDate timestamp  NOT NULL,
  descriptions VARCHAR(255) NOT NULL,
  PRIMARY KEY (truckId)
);

DROP TABLE IF EXISTS orderz;
CREATE TABLE orderz (
  orderId INT NOT NULL AUTO_INCREMENT,
  petrolQty DOUBLE NOT NULL,
  orderDate timestamp NOT NULL,
  truckId INT,
  PRIMARY KEY (orderId),
  FOREIGN KEY (truckId) REFERENCES truck(truckId)
  ON UPDATE CASCADE
  ON DELETE CASCADE
);

所以问题是我不希望平均值取决于哪个月或哪个月,因为我会得到不同月份的不同平均值 我想要一个平均/ permonth代表一辆卡车的所有订单,所以我想要的是一个获取ID,显示卡车所有订单的平均/每月 注意每个月我非常重要 目前我正在工作的是这个我希望得到一个平均/每月,所以当我得到卡车的详细信息,包括它已经发出的订单,我也将得到一个平均说明所有订单,按订单日期分类

这是结果

+-----------+---------------------+
| TRUCKCODE | AVG(AVGPETROLQTY)   |
+-----------+---------------------+
| BY2004    |                13.0 |
| BY2874    |                13.0 |
| BY2994    |                 0.0 |
| BY8754    |                 0.0 |
| BY2354    |                33.0 |
+-----------+---------------------+

1 个答案:

答案 0 :(得分:1)

我想你第一次差点儿得到它。你需要:

  • 按年/月将分组添加到原始查询中,以获得每月平均值。
  • 对您已有的结果执行选择并按卡车对其进行分组,围绕第一个查询进行额外选择:

生成的完整查询是:

boolean containsURL(String[] array, URL url) {
    for (String s : array)
        if (url.startsWith(s))
            return true;
    return false;
}

isSupported = containsURL(supported, url);

此解决方案有两个select truckcode, avg(avgPetrolQty) from ( SELECT t.truckCode, COALESCE(year(orderDate),'Not Announced') as year, COALESCE(monthname(orderDate),'Not Announced') as month, IFNULL (avg(petrolQty),0) as avgPetrolQty from truck t left join orderz o on t.truckId = o.truckId group by t.truckCode, COALESCE(year(orderDate),'Not Announced'), COALESCE(monthname(orderDate),'Not Announced') ) group by truckcode ,内部包含在外部。

内部选择按年/月/卡车组合平均金额。如果卡车在3个月内(2005年1月,2005年8月,2006年1月)有20个订单,则内部查询将生成三行。每个人都会显示每个月的平均金额。其他卡车将在此查询中显示更多行。

然后,取这个中间结果,外部查询将每辆卡车的行平均为一个。因此,对于有问题的卡车,三个“每月”行平均为一个。其他卡车在此查询中也会获得一行。

就是这样!玩得开心。