我正在考虑使用维度建模/星型模式仓库来支持现有的商业智能报告流程(显然我希望能够支持其他甚至尚未实现的BI任务),并且我有一个非常基本的问题,了解我的最终用户如何编写我认为应该是一个非常简单的查询。
在SQL星型模式中考虑一个与销售业务流程相关的事实表,其中包含单个订单。当前的BI报告按时间和地理位置整理数据(对于每个美国州,每周常见一行)。它报告了许多列中的实际销售数字,这些数字总体上是详尽且相互排斥的(MECE:如果您要将它们全部加在一起,您就会知道该州当周发生了多少销售)。
可能会有很多这样的专栏,在一些报告中有数百个,因为它被不同的产品,销售渠道等切割。
最终用户如何轻松地编写这样的查询,并确保它们是MECE?显然,您可以使用大型CASE ... WHEN
块,但这依赖于用户或BI工具强制执行捕获所有内容的规则。什么是反映for each combination of sales channel and product in this list of combinations, make a column. For any combination not in the list, group into 'other'
的任务的常用技术?
我可以想象一些PL / *脚本会编写不正常的CASE ... WHEN
块,其中最后一列会有数百条条件语句,但我很难相信这是一种有效的方法。
使用块时的案例查询:
SELECT
date.week,
geography.state,
CASE WHEN channel.channel = 'DIRECT'
AND product.name = 'ITEM 1'
THEN SUM(sales.values)
ELSE 0 as direct_item_1,
CASE WHEN channel.channel = 'AFFILIATE'
AND product.name = 'ITEM 5'
THEN SUM(sales.values)
ELSE 0 as affiliate_item_5,
CASE WHEN NOT ((channel.channel = 'DIRECT'
AND product.name = 'ITEM 1') OR (channel.channel = 'AFFILIATE'
AND product.name = 'ITEM 5'))
THEN SUM(sales.values)
ELSE 0 as other
FROM
sales,
channel,
product,
date,
geography
WHEN
date.date_key = sales.date_key AND
geography.geo_key = sales.geo_key AND
channel.channel_key = sales.channel_key AND
product.product_key = sales.product_key
GROUP BY
date.week,
geography.state