Sql 计算以前计算的数据的摘要

Sql 计算以前计算的数据的摘要,sql,summary,Sql,Summary,有关摘要数据的快速问题: 我有下面的代码,可以提取销售信息并将其放入一个月/年的网格中,这非常棒(): 任何帮助都将不胜感激 e、 g 2012年所有销售额的总和将显示在2012列的底部问题1。替换号码 例如,要替换数字,您可以更改以下内容: months AS (SELECT 1 AS mon UNION ALL SELECT mon + 1 FROM months WHERE mon < 12) 或将联合添加到查询中: with myresults as (the whole thi

有关摘要数据的快速问题:

我有下面的代码,可以提取销售信息并将其放入一个月/年的网格中,这非常棒():

任何帮助都将不胜感激

e、 g 2012年所有销售额的总和将显示在2012列的底部

问题1。替换号码 例如,要替换数字,您可以更改以下内容:

months AS (SELECT 1 AS mon UNION ALL SELECT mon + 1 FROM months WHERE mon < 12)
或将联合添加到查询中:

with myresults as (the whole thing)
select 1 ordering
,      myresults.columns-minus-total
,      myresults.something subtotal
from   myresults
union all
select 2 ordering
,      myresults.columns-minus-total
,      sum(something) grandtotal
from   myresults
order
by     1
,      ...other...
使用Microsoft SQL Server 2008 R2的完整示例 原始代码经过修饰,不依赖于表:

with months as 
( select 1 as mon 
  ,      'Jan' monname
  union all 
  select 2
  ,      'Feb'
  union all 
  select 3
  ,      'Mar'
  union all 
  select 4
  ,      'Apr'
  union all 
  select 5
  ,      'May'
  union all 
  select 6
  ,      'Jun'
  union all 
  select 7
  ,      'Jul'
  union all 
  select 8
  ,      'Aug'
  union all 
  select 9
  ,      'Sep'
  union all 
  select 10
  ,      'Oct'
  union all 
  select 11
  ,      'Nov'
  union all 
  select 12
  ,      'Dec'
)
, years as 
  ( select 2011 as yr 
    union all 
    select 2012 
    union all 
    select 2013
    union all 
    select 2014
  )
, invoices as 
  ( select cast('2013-06-27' as date) as invoicedate
    ,      40 as marginamount
    union 
    select cast('2013-07-29' as date) as invoicedate
    ,      40 as marginamount
    union 
    select cast('2013-10-30' as date) as invoicedate
    ,      40 as marginamount
  )
select * 
from   ( select months.mon
         ,      years.yr
         ,      coalesce(sum(inv.marginamount), 0) as marginamount
         from   months
         cross 
         join   years 
         left 
         outer 
         join   invoices inv 
         on     year(inv.invoicedate)  = years.yr
         and    month(inv.invoicedate) = months.mon
         group 
         by     months.mon
         ,      years.yr 
       ) source 
pivot  ( max(marginamount)
         for yr 
         in  ( [2011], [2012], [2013], [2014], [2015]
             )
       ) pvt  
order 
by     mon
添加文本和总计将导致:

with months as 
( select 1 as mon 
  ,      'Jan' monname
  union all 
  select 2
  ,      'Feb'
  union all 
  select 3
  ,      'Mar'
  union all 
  select 4
  ,      'Apr'
  union all 
  select 5
  ,      'May'
  union all 
  select 6
  ,      'Jun'
  union all 
  select 7
  ,      'Jul'
  union all 
  select 8
  ,      'Aug'
  union all 
  select 9
  ,      'Sep'
  union all 
  select 10
  ,      'Oct'
  union all 
  select 11
  ,      'Nov'
  union all 
  select 12
  ,      'Dec'
)
, years as 
  ( select 2011 as yr 
    union all 
    select 2012 
    union all 
    select 2013
    union all 
    select 2014
  )
, invoices as 
  ( select cast('2013-06-27' as date) as invoicedate
    ,      40 as marginamount
    union 
    select cast('2013-07-29' as date) as invoicedate
    ,      40 as marginamount
    union 
    select cast('2013-10-30' as date) as invoicedate
    ,      40 as marginamount
  )
select case
       when mon is null
       then 'Total'
       else cast(mon as varchar)
       end
,      monname
,      [2011]
,      [2012]
,      [2013]
,      [2014]
,      [2015]
from   ( select months.mon
         ,      months.monname
         ,      years.yr
         ,      coalesce(sum(inv.marginamount), 0) as marginamount
         from   months
         cross 
         join   years 
         left 
         outer 
         join   invoices inv 
         on     year(inv.invoicedate)  = years.yr
         and    month(inv.invoicedate) = months.mon
         group
         by     grouping sets
                ( (months.mon, months.monname, years.yr)
                , (years.yr)
                )
       ) source 
pivot  ( max(marginamount)
         for yr 
         in  ( [2011], [2012], [2013], [2014], [2015]
             )
       ) pvt  
order 
by     coalesce(mon, 100)

您好,Guido,非常感谢您的回复,但我无法获得工作中提供的任何部分答案-您是否有机会使用SQL fiddle,看看是否可以使其在限制范围内工作?我应该提到的是SQL server 2008工作得非常好!谢谢Guido,你的SQL技能太棒了!谢谢,这是一个很好的练习。
group
by    grouping sets
      ( ()
      , (full list)
      )
with myresults as (the whole thing)
select 1 ordering
,      myresults.columns-minus-total
,      myresults.something subtotal
from   myresults
union all
select 2 ordering
,      myresults.columns-minus-total
,      sum(something) grandtotal
from   myresults
order
by     1
,      ...other...
with months as 
( select 1 as mon 
  ,      'Jan' monname
  union all 
  select 2
  ,      'Feb'
  union all 
  select 3
  ,      'Mar'
  union all 
  select 4
  ,      'Apr'
  union all 
  select 5
  ,      'May'
  union all 
  select 6
  ,      'Jun'
  union all 
  select 7
  ,      'Jul'
  union all 
  select 8
  ,      'Aug'
  union all 
  select 9
  ,      'Sep'
  union all 
  select 10
  ,      'Oct'
  union all 
  select 11
  ,      'Nov'
  union all 
  select 12
  ,      'Dec'
)
, years as 
  ( select 2011 as yr 
    union all 
    select 2012 
    union all 
    select 2013
    union all 
    select 2014
  )
, invoices as 
  ( select cast('2013-06-27' as date) as invoicedate
    ,      40 as marginamount
    union 
    select cast('2013-07-29' as date) as invoicedate
    ,      40 as marginamount
    union 
    select cast('2013-10-30' as date) as invoicedate
    ,      40 as marginamount
  )
select * 
from   ( select months.mon
         ,      years.yr
         ,      coalesce(sum(inv.marginamount), 0) as marginamount
         from   months
         cross 
         join   years 
         left 
         outer 
         join   invoices inv 
         on     year(inv.invoicedate)  = years.yr
         and    month(inv.invoicedate) = months.mon
         group 
         by     months.mon
         ,      years.yr 
       ) source 
pivot  ( max(marginamount)
         for yr 
         in  ( [2011], [2012], [2013], [2014], [2015]
             )
       ) pvt  
order 
by     mon
with months as 
( select 1 as mon 
  ,      'Jan' monname
  union all 
  select 2
  ,      'Feb'
  union all 
  select 3
  ,      'Mar'
  union all 
  select 4
  ,      'Apr'
  union all 
  select 5
  ,      'May'
  union all 
  select 6
  ,      'Jun'
  union all 
  select 7
  ,      'Jul'
  union all 
  select 8
  ,      'Aug'
  union all 
  select 9
  ,      'Sep'
  union all 
  select 10
  ,      'Oct'
  union all 
  select 11
  ,      'Nov'
  union all 
  select 12
  ,      'Dec'
)
, years as 
  ( select 2011 as yr 
    union all 
    select 2012 
    union all 
    select 2013
    union all 
    select 2014
  )
, invoices as 
  ( select cast('2013-06-27' as date) as invoicedate
    ,      40 as marginamount
    union 
    select cast('2013-07-29' as date) as invoicedate
    ,      40 as marginamount
    union 
    select cast('2013-10-30' as date) as invoicedate
    ,      40 as marginamount
  )
select case
       when mon is null
       then 'Total'
       else cast(mon as varchar)
       end
,      monname
,      [2011]
,      [2012]
,      [2013]
,      [2014]
,      [2015]
from   ( select months.mon
         ,      months.monname
         ,      years.yr
         ,      coalesce(sum(inv.marginamount), 0) as marginamount
         from   months
         cross 
         join   years 
         left 
         outer 
         join   invoices inv 
         on     year(inv.invoicedate)  = years.yr
         and    month(inv.invoicedate) = months.mon
         group
         by     grouping sets
                ( (months.mon, months.monname, years.yr)
                , (years.yr)
                )
       ) source 
pivot  ( max(marginamount)
         for yr 
         in  ( [2011], [2012], [2013], [2014], [2015]
             )
       ) pvt  
order 
by     coalesce(mon, 100)