如何创建 SQL 分组小计?

问题描述

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

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),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),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 的帮助!

结果如下:

MyYear  SalesRegion type    jan feb mar
2021    2   revenue 12345,00    12345,00
2021    2   margin  12345,00
2021    1   revenue 12345,00
2021    1   margin  12345,00
2021    3   revenue 12345,00
2021    3   margin  12345,00
2021    4   revenue 12345,00

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

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

像这样:

MyYear  SalesRegion type    jan feb mar
2021    2   revenue 12345,00
Subtotal 2-1-3 - revenue    12345,00
Subtotal 2-1-3 - margin     12345,00    
2021    4   revenue 12345,00
.. and so on

问题是,我使用 Advantage DataBase,但它没有 Pivot、Group By Rollup、cube 等或我一直在阅读的任何其他有用的功能

那么,有没有一种简单的方法可以在不使用这些函数的情况下将其添加到我当前的代码中?

解决方法

好的 - 谢谢。

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

问题是,我使用 Advantage DataBase,但它没有 Pivot、Group By Rollup、cube 等或我一直在阅读的任何其他有用的功能。

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

如果可能 - 采用原始代码 - 将 case 语句移出 order 子句以在 DAB000 表的末尾创建一个新的 [calculated] 列 - 并部署到视图中

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

  • 附加一列显示 SalesRegionOrder

偏好

创建视图 RegionSalesView as SELECT YEAR(DAB020.date) as MyYear, DAB000.SalesRegion,DAB000.SalesRegionOrder,类型,SUM(CASE WHEN MONTH(DAB020.date) = 1 THEN ROUND(DAB020.value) END) as jan,
SUM(CASE WHEN MONTH(DAB020.date) = 2 THEN ROUND(DAB020.value) END) as feb,SUM(CASE WHEN MONTH(DAB020.date) = 3 THEN ROUND(DAB020.value) END) as mar FROM ( 选择 DAB020.* 来自 (SELECT ....) mysalesdata 左连接( 选择 *,CASE WHEN DAB000.SalesRegion = 2 THEN 0 ... . 当 DAB000.SalesRegion = 5 THEN 5 ELSE 6 结束为 SalesRegionOrder 从 "DF030000.DBF" DAB000 ) DAB000 on mysalesdata.PERSNR = DAB000.KDNR GROUP BY YEAR(DAB020.date),DAB000.SalesRegion,DAB000.SalesRegionOrder,DAB输入

第 2 步创建并维护一个新的自定义表 GroupRegions

使用描述您需要的确切报告级别的元数据

(为了简洁,这里用 JSON 表示,并且是说明性的)

{ 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 名称创建聚合。

    创建视图 GroupedRegionSalesView as 选择 RegionSalesView.Myyear,GroupRegions.GroupRegionName,LastRegionOrdered+0.1 作为 GroupOrder,RegionSalesView.type,sum(RegionSalesView.jan) 为 jan,sum(RegionSalesView.feb) as feb,sum(RegionSalesView.mar) as mar 来自 RegionSales 在 GroupRegions.SalesRegion = RegionSalesView.SalesRegion 上加入 GroupRegions 内连接(选择 GroupRegionName,max(GroupOrder) 作为 LastRegionOrdered 来自 GroupRegions 组 by GroupRegionName) 订购者 Orderer.GroupRegionName = RegionSales.GroupRegionName 按 RegionSalesView.Myyear 分组,RegionSalesView.type )

第 4 步 - 将两者结合起来

select RegionSalesView.Myyear,cast(RegionSalesView.SalesRegion as SalesRegion),cast(GroupRegions.GroupOrder as float) as GroupRegions,RegionSalesView.jan,RegionSalesView.feb,RegionSalesView.mar 
 from RegionSalesView
union
select * from GroupedRegionSalesView 
order by GroupOrder,type

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...