【问题标题】:SQL query: get total values for each monthSQL查询:获取每个月的总值
【发布时间】:2020-11-04 02:50:46
【问题描述】:

我有一张桌子,可以存储每天售出的水果数量。存储特定日期售出的商品数量。

CREATE TABLE data
(
    code VARCHAR2(50) NOT NULL,
    amount NUMBER(5) NOT NULL,
    DATE  VARCHAR2(50) NOT NULL,
);

样本数据

code  |amount|   date
------+------+------------
aple  |  1   | 01/01/2010
aple  |  2   | 02/02/2010
orange|  3   | 03/03/2010
orange|  4   | 04/04/2010

我需要写一个查询,列出一月和二月卖了多少苹果和橙子?

--total apple for jan
select sum(amount) from mg.drum d where date >='01/01/2010' and cdate < '01/02/2020' and code = 'aple'; 

--total apple for feb
select sum(amount) from mg.drum d where date >='01/02/2010' and cdate < '01/03/2020' and code = 'aple';

--total orange for jan
select sum(amount) from mg.drum d where date >='01/01/2010' and cdate < '01/02/2020' and code = 'orange';

--total orange for feb
select sum(amount) from mg.drum d where date >='01/02/2010' and cdate < '01/03/2020' and code = 'orange';

如果我需要计算更多的月份,更多的水果,那很乏味。有没有简短的查询要写?

我可以将至少几个月合并为 1 个查询吗?那么 1 次查询可以获得每个月 1 个水果的总数?

【问题讨论】:

  • 编辑您的问题并显示您想要的结果。

标签: sql oracle oracle11g


【解决方案1】:

你可以使用条件聚合比如

SELECT TO_CHAR("date",'MM/YYYY') AS "Month/Year",
       SUM( CASE WHEN code = 'apple' THEN amount END ) AS apple_sold,
       SUM( CASE WHEN code = 'orange' THEN amount END ) AS orange_sold
  FROM data
 WHERE "date" BETWEEN date'2020-01-01' AND date'2020-02-29'
 GROUP BY TO_CHAR("date",'MM/YYYY')

其中date 是保留关键字,除非被引用,否则不能是列名。

Demo

【讨论】:

    【解决方案2】:
    select sum(amount), //date.month 
    from mg.drum
    group by //date.month
    

    //data.month 在这里你可以给出返回月份数或名称的表达式。

    【讨论】:

      【解决方案3】:

      如果您要处理月份,那么您也应该包括年份。我会推荐:

      SELECT TRUNC(date, 'MON') as yyyymm, code,
             SUM(amount)
      FROM t
      GROUP BY TRUNC(date, 'MON'), code;
      

      如果您只需要一些日期或代码,可以添加WHERE 子句。

      这将为包含数据的每一行返回一个单独的行。这与您的四个查询的结果非常接近——但这不会返回 0 值。

      【讨论】:

        【解决方案4】:
        select to_char(date_col,'MONTH') as month, code, sum(amount)
        from mg.drum
        group by to_char(date_col,'MONTH'), code
        

        【讨论】:

        • 感谢您的提示。我只是使用了问题中的列名而没有引起太多注意。现在会改变它
        猜你喜欢
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 2021-02-18
        • 2015-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多