MDX Step by Step 读书笔记(六) - Building Complex Sets (复杂集合的处理) - Combining Sets
2013-04-26 18:16 BIWORK 阅读(880) 评论(1) 编辑 收藏 举报Combining Sets
不同的集合可以通过一定的方式组成新的集合,常提到的几种联合集合的方式如下图所示:
- Union 模式 – 两个集合连接在一起形成一个新的集合,这个新集合包含了左右两边集合的内容。
- Intersection 模式 – 只有内容相同的一部分才能被保留下来形成一个新的集合。
- Exception 模式 – 第一个集合不在第二个集合的范围,保留下来形成一个新的集合。
语法 –
Union ({Set1}, {Set2} [, ALL])
Intersect ({Set1}, {Set2} [, ALL])
Exception ({Set1}, {Set2} [, ALL])
这三个函数都要求作为参数的两个集合必须属于同一个纬度,被函数返回的集合中的元组都是唯一的,相当于在返回的集合上使用了 DISTINCT 一样,除非使用 ALL 来标示不需要DISTINCT。
通常情况下,Union 和 Exception 使用的频率会多一些,所以MDX 语言为它们提供了一种更简单的表达方式。可以使用 + 和 – 来替代,但是这时就不能使用 ALL 标志了。
示例一 – 查询2004年零售额最高的10个产品
SELECT {([Measures].[Reseller Sales Amount])} ON COLUMNS, TopCount( {[Product].[Product].[Product].Members}, 10, ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2004]) ) ON ROWS FROM [Step-by-Step];
示例二 – 使用UNION 查询2003年和2004年各自零售额最高的10个产品
SELECT {([Measures].[Reseller Sales Amount])} ON COLUMNS, Union( TopCount( {[Product].[Product].[Product].Members}, 10, ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2003]) ), TopCount( {[Product].[Product].[Product].Members}, 10, ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2004]) ) ) ON ROWS FROM [Step-by-Step];
总共只有12个产品查询出来,很显然有一些产品既在第一个集合中也在第二个集合中存在。
示例三 – 看看2013年的前10产品跌出了2014年前10
SELECT {([Measures].[Reseller Sales Amount])} ON COLUMNS, Except( TopCount( {[Product].[Product].[Product].Members}, 10, ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2003]) ), TopCount( {[Product].[Product].[Product].Members}, 10, ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2004]) ) ) ON ROWS FROM [Step-by-Step];
示例四 – 2004年前10的产品不在2003年前10的有哪些
SELECT {([Measures].[Reseller Sales Amount])} ON COLUMNS, Except( TopCount( {[Product].[Product].[Product].Members}, 10, ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2004]) ), TopCount( {[Product].[Product].[Product].Members}, 10, ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2003]) ) ) ON ROWS FROM [Step-by-Step];
示例五 – 查看有哪些产品在2003年和2004年都是前10的
SELECT {([Measures].[Reseller Sales Amount])} ON COLUMNS, Intersect( TopCount( {[Product].[Product].[Product].Members}, 10, ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2004]) ), TopCount( {[Product].[Product].[Product].Members}, 10, ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2003]) ) ) ON ROWS FROM [Step-by-Step]
更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!