【发布时间】:2015-02-10 16:14:11
【问题描述】:
我需要按客户组显示前 5 位客户销售额,但该组内的其他客户销售额汇总为“其他”。类似于this question,但对每个客户组分别计算。
根据MSDN 执行TopCount,在一组成员上你必须使用Generate 函数。
这部分工作正常:
with
set [Top5CustomerByGroup] AS
GENERATE
(
[Klient].[Grupa Klientow].[Grupa Klientow].ALLMEMBERS,
TOPCOUNT
(
[Klient].[Grupa Klientow].CURRENTMEMBER * [Klient].[Klient].[Klient].MEMBERS
, 5
, [Measures].[Przychody ze sprzedazy rzeczywiste wartosc]
)
)
SELECT
{ [Measures].[Przychody ze sprzedazy rzeczywiste wartosc]} ON COLUMNS,
{
[Klient].[Grupa Klientow].[Grupa Klientow].ALLMEMBERS * [Klient].[Klient].[All], --for drilldown purposes
[Top5CustomerByGroup]
}
ON ROWS
FROM
(
SELECT ({[Data].[Rok].&[2013]} ) ON COLUMNS
FROM [MyCube]
)
但是我对“其他”部分有疑问。
我认为我能够按组与其他客户构建集合(数据看起来不错):
set [OtherCustomersByGroup] AS
GENERATE
(
[Klient].[Grupa Klientow].[Grupa Klientow].ALLMEMBERS,
except
(
{[Klient].[Grupa Klientow].CURRENTMEMBER * [Klient].[Klient].[Klient].MEMBERS},
TOPCOUNT
(
[Klient].[Grupa Klientow].CURRENTMEMBER * [Klient].[Klient].[Klient].MEMBERS
, 5
, [Measures].[Przychody ze sprzedazy rzeczywiste wartosc]
)
)
)
但是我不知道如何通过分组来聚合它。
像this question那样做这个
member [Klient].[Klient].[tmp] as
aggregate([OtherCustomersByGroup])
产生一个值,这是合乎逻辑的。
我认为我需要每个组中包含“其他”客户的集合列表,而不是单个 [OtherCustomersByGroup] 集合,但不知道如何构建它们。
有人有什么想法或建议吗?
更新:
对我的需求有一些误解。我需要每个客户组中按销售额排名前 n 位的客户,并将该组中其他客户的销售额汇总到一个位置(假设称为“其他”)。
例如对于这个简化的输入:
| Group | Client | Sales |
|--------|----------|--------|
| Group1 | Client1 | 300 |
| Group1 | Client2 | 5 |
| Group1 | Client3 | 400 |
| Group1 | Client4 | 150 |
| Group1 | Client5 | 651 |
| Group1 | Client6 | null |
| Group2 | Client7 | 11 |
| Group2 | Client8 | 52 |
| Group2 | Client9 | 44 |
| Group2 | Client10 | 21 |
| Group2 | Client11 | 201 |
| Group2 | Client12 | 325 |
| Group2 | Client13 | 251 |
| Group3 | Client14 | 15 |
我需要这样的输出(这里是前 2 个):
| Group | Client | Sales |
|--------|----------|--------|
| Group1 | Client5 | 651 |
| Group1 | Client3 | 400 |
| Group1 | Others | 455 |
| Group2 | Client12 | 325 |
| Group2 | Client13 | 251 |
| Group2 | Others | 329 |
| Group3 | Client14 | 15 |
| Group3 | Others | null | <- optional row
排序不是必需的,我们将在客户端处理它。
【问题讨论】:
-
“与分组”是什么意思?你想要什么有什么区别,你链接到的另一个问题是做什么的?
-
@TabAlleman 我希望每个客户群都获得前 5 名和“其他”,而不是一位将军。如链接的 MSDN 文章中所述:“Generate 最常见的实际用途是在一组成员上评估复杂的集合表达式,例如 TopCount。以下示例查询显示行中每个日历年的前 10 个产品 [. ..] 请注意,每年都会显示不同的前 10 名,而使用 Generate 是获得此结果的唯一方法。”我还需要一组成员的“其他人”
-
这是可能的,但相当复杂:我也许可以提供一个 advWrks 脚本
-
@whytheq,希望你能开发出比我的答案更好的东西,因为即使对于单选查询,它也不是添加成员的最佳解决方案,而且还有大量的乘法。
-
@AlexPeshik 我有一个反对 AdvWrks 立方体的
top N of top M with Other member脚本 - 我可以发布它,但它完全需要重新编写以适应这个问题:我没有时间这样做。