group by extract sql

时间:2017-12-15 19:51:51

标签: sql oracle

我正在尝试按几列进行分组,包括月份和年份的提取列。 sql按原始日期列保持返回组。如何将日期提取到月份和年份,然后对此列进行分组。下面是我的完整SQL:

select Name,
extract(month from fill_Date) as Month,
extract(year from fill_Date) as Year, 
sum(quantity)
from Table A
group by Name,fill_Date

1 个答案:

答案 0 :(得分:0)

您可以在group-by子句中重复extract()次调用:

select Name,
  extract(month from fill_Date) as Month,
  extract(year from fill_Date) as Year, 
  sum(quantity)
from TableA
group by Name,
  extract(month from fill_Date),
  extract(year from fill_Date)

或者使用子查询(内联视图)或CTE来提取值,然后使用列别名进行分组 - 您不能在与其定义的查询级别相同的位置引用列别名,但子查询意味着它不是同一级别:

select Name,
  Month,
  Year,
  sum(quantity)
from (
  select Name,
    extract(month from fill_Date) as Month,
    extract(year from fill_Date) as Year, 
    quantity
  from TableA
)
group by Name,
  Month,
  Year

您不必单独提取年份和月份,但您当然可能需要。如果您的目标只是按年/月组合进行分组,则可以使用trunc()功能使其忽略列值的日期和任何时间,并将其分组:

select Name,
  to_char(trunc(fill_Date, 'MM'), 'MM YYYY') as month,
  sum(quantity)
from TableA
group by Name,
  trunc(fill_Date, 'MM')

trunc(fill_Date, 'MM')会在一月的第一天给你午夜。在选择列表中使用to_char()格式化仅显示月份和年份,但现在在单个列中,并且作为字符串而不是两个数字。您可以在分组中使用to_char()但不需要。{/ p>