问题描述
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