首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建SQL分组小计?

如何创建SQL分组小计?
EN

Stack Overflow用户
提问于 2021-03-18 22:26:57
回答 1查看 48关注 0票数 0

我有以下代码,其中显示了按月和每个销售区域的销售数据:

代码语言:javascript
复制
SELECT
   YEAR(date) as MyYear, DAB000.SalesRegion,
   type,
   SUM(CASE WHEN MONTH(date) =  1 THEN ROUND(value) END) as jan,
   SUM(CASE WHEN MONTH(date) =  2 THEN ROUND(value) END) as feb,
   SUM(CASE WHEN MONTH(date) =  3 THEN ROUND(value) END) as mar
   FROM
   (
      SELECT DAB020.*
      FROM
      (SELECT date, 'revenue' as type, value, buart, auf_kumsta,PERSNR FROM "DAB020.ADT"
      UNION ALL
      SELECT date, 'margin' as type, value - (menge*ekp/pe), buart, auf_kumsta,PERSNR FROM "DAB020.ADT"
      ) DAB020
      WHERE buart = 'A' AND auf_kumsta = 'J' AND date >= '2021-01-01'
     ) mysalesdata
     left join "DF030000.DBF" DAB000 on mysalesdata.PERSNR = DAB000.KDNR
 GROUP BY YEAR(date),DAB000.SalesRegion, type
 ORDER BY
    CASE WHEN DAB000.SalesRegion = 2 THEN 0
         WHEN DAB000.SalesRegion = 1 THEN 1
         WHEN DAB000.SalesRegion = 3 THEN 2
         WHEN DAB000.SalesRegion = 4 THEN 3
         WHEN DAB000.SalesRegion = 6 THEN 4
         WHEN DAB000.SalesRegion = 5 THEN 5
         ELSE 6 END, type DESC

感谢@gordon-linoff在这方面的帮助!

结果如下所示:

代码语言:javascript
复制
MyYear  SalesRegion type    jan feb mar
2021    2   revenue 12345,00    12345,00    12345,00
2021    2   margin  12345,00    12345,00    12345,00
2021    1   revenue 12345,00    12345,00    12345,00
2021    1   margin  12345,00    12345,00    12345,00
2021    3   revenue 12345,00    12345,00    12345,00
2021    3   margin  12345,00    12345,00    12345,00
2021    4   revenue 12345,00    12345,00    12345,00

使用这个案例,我手动强制对销售区域进行分组。2-1-3和4-6-5.

我想要的是,对于每个分组(2-1-3和4-6-5)是有一个小计行(S)。

如下所示:

代码语言:javascript
复制
MyYear  SalesRegion type    jan feb mar
2021    2   revenue 12345,00    12345,00    12345,00
2021    2   margin  12345,00    12345,00    12345,00
2021    1   revenue 12345,00    12345,00    12345,00
2021    1   margin  12345,00    12345,00    12345,00
2021    3   revenue 12345,00    12345,00    12345,00
2021    3   margin  12345,00    12345,00    12345,00
Subtotal 2-1-3 - revenue    12345,00    12345,00    12345,00
Subtotal 2-1-3 - margin     12345,00    12345,00    12345,00    
2021    4   revenue 12345,00    12345,00    12345,00
.. and so on

问题是,我使用Advantage DataBase,它没有透视,分组汇总,立方体等或任何其他有用的函数,我已经读到。

那么,有没有一种简单的方法可以将它添加到我当前的代码中,而不使用这样的函数呢?

EN

回答 1

Stack Overflow用户

发布于 2021-03-19 00:55:38

好的-谢谢。

所以我在你的原始问题中询问了这一行

问题是,我使用Advantage DataBase,它没有透视、分组汇总、多维数据集等,或者我读到的任何其他有用的函数。

我发送的链接描述了使用group by构建聚合

如果可能-取原始代码-将case语句移出order子句,以便在DAB000表的末尾创建一个新的计算列-并部署到视图中

第1步-将您的(细粒度)销售摘要部署到独立视图

具有显示SalesRegionOrder首选项的附加列的

偏好

创建视图类型为SELECT年(DAB020.Date) as MyYear,DAB000.SalesRegion,DAB000.SalesRegion,DAB000.TYPE,SUM(CASE WHEN MONTH(DAB020.date) =1然后舍入(DAB020.VALUE) END) as jan,

SUM(CASE WHEN MONTH(DAB020.date) =2 THEN ROUND(DAB020.value) END)作为feb,SUM(CASE WHEN MONTH(DAB020.date) =3 THEN ROUND(DAB020.value) END) as mar (SELECT DAB020.* FROM ( SELECT ....)mysalesdata left join ( select *,CASE WHEN DAB000.SalesRegion =2 THEN 0...当DAB000.SalesRegion =5然后5,否则6作为SalesRegionOrder结束,来自"DF030000.DBF“mysalesdata.PERSNR上的DAB000 ) DAB000 = DAB000.KDNR按年分组(DAB020.date),DAB000.SalesRegion,DAB000.SalesRegionOrder,DAB020.type

第2步创建和维护新的定制表GroupRegions

元数据描述了您所需的确切报告级别

(为简洁起见,此处表示为JSON,仅用于说明)

代码语言:javascript
复制
{ GroupRegions
{GroupRegionsName :'2-1-3',
   {SalesRegion : 2, GroupOrder : 0},
   {SalesRegion : 1, GroupOrder : 1},
   {SalesRegion : 3, GroupOrder : 2}},
{GroupRegionsName : '4',
   {SalesRegion : 4, GroupOrder : 3},
{GroupRegionsName : '6',
   {SalesRegion : 6, GroupOrder : 4},
{GroupRegionsName : '5',
   {SalesRegion : 5, GroupOrder : 5}}}

等。

步骤3 --在自己的视图中使用SalesAggregations

  • 构建一个新的查询,以从RegionSalesView和GroupRegions-中提取,并使用GroupRegions名称创建聚合。

create view GroupedRegionSalesView as select RegionSalesView.Myyear,GroupRegions.GroupRegionName,LastRegionOrdered+0.1 as GroupOrder,RegionSalesView.type,sum(RegionSalesView.jan) as jan,sum(RegionSalesView.feb) as feb,sum(RegionSalesView.mar) as mar RegionSales inner join GroupRegions on GroupRegions.SalesRegion = RegionSalesView.SalesRegion inner join (select GroupRegionName,max(GroupOrder) as LastRegionOrdered from GroupRegions group by by GroupRegionName)排序人= group by,,)

第4步-将两者结合在一起

代码语言:javascript
复制
select RegionSalesView.Myyear
 , cast(RegionSalesView.SalesRegion as SalesRegion)
 , cast(GroupRegions.GroupOrder as float) as GroupRegions
 , RegionSalesView.type
 , RegionSalesView.jan
 , RegionSalesView.feb
 , RegionSalesView.mar 
 from RegionSalesView
union
select * from GroupedRegionSalesView 
order by GroupOrder, type
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66693109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档