SAP BO - 如何在每行中每周获得 1/0 个不同的值
SAP BO - how to get 1/0 distinct values per week in each row
我试图解决的问题是让 SAP Business Objects 查询为我计算一个变量,因为在大型 excel 文件中计算它会使进程崩溃。
我有一堆包含 daily/weekly 数据的列。我想在一周内为 Name/Person/Certain Identificator 的第一个实例获得“1”,并为所有其余实例获得“0”。
因此,例如,如果商品 "Glass" 在第 4 周售出 5 次,在这 variable/column 中,第一笔销售将获得“1”,接下来的 4 笔销售将获得“0”。这将使我能够获得特定一周内销售的不同商品的数量。
我知道 Business Objects 中有 Count 和 Count 不同的函数,但是我更愿意为整个原始 table 数据使用这个 1/0 系统,因为我将它用作一个完整的仪表板,并且有很多指标,其中 distinct 将是 part/slicer。
我之前的做法是使用 excel 公式:=IF(SUMPRODUCT(($A$2:$A5000=$A2)*($G$2:$G5000=$G2))> 1,0,1)
这样就可以了,对于 G 列中出现在 A 列特定值范围内的值的第一个实例(A 列是星期)给出“1”,当相同的值再次出现时给出“0” A列中相同的星期值。当星期值改变时,它会再次给出“1”。
由于它是在每行中的 2 个单元格中比较整列数据,因此随着数据变大,这往往会崩溃。
到目前为止,我无法在 Business Objects 中模拟这一点,我想我已经用尽了我的能力和谷歌搜索。
任何人都可以分享他们的两分钱吗?
我想你想要逻辑围绕 row_number()
:
select t.*,
(case when 1 = row_number() over (partition by name, person, week, identifier
order by ??
)
then 1 else 0
end) as new_indicator
from t;
注意 ??
。 SQL table 表示 无序 集合。 table 或一组行中没有 "first" 行,除非列指定了该顺序。 ??
用于此类列(可能是 date/time 列,可能是 id)。
如果你只想标记一行,你可以在那里放任何东西,比如order by (select null)
或order by week
。
假设您在查询中有一个唯一标识一行的对象,您可以通过几个简单的步骤完成此操作。
假设您的查询包含以下对象:
Sale ID
Name
Person
Sale Date
Week #
Price
etc.
您想为每个 Name/Week #.
的第一次出现显示 1
第 1 步:创建具有以下定义的变量。我们称它为 [FirstOne]
=Min([Sale ID]) In ([Name];[Week #])
第 2 步:在报告块中,添加具有以下公式的列:
=If [FirstOne] = [Sale ID] Then 1 Else 0
这应该在表示第 # 周内第一次出现 Name 的行中产生 1。如果你想在第一次出现 Name/Person/Week # 时显示 1,你可以相应地修改 [FirstOne] 变量:
=Min([Sale ID]) In ([Name];[Person];[Week #])
我试图解决的问题是让 SAP Business Objects 查询为我计算一个变量,因为在大型 excel 文件中计算它会使进程崩溃。
我有一堆包含 daily/weekly 数据的列。我想在一周内为 Name/Person/Certain Identificator 的第一个实例获得“1”,并为所有其余实例获得“0”。
因此,例如,如果商品 "Glass" 在第 4 周售出 5 次,在这 variable/column 中,第一笔销售将获得“1”,接下来的 4 笔销售将获得“0”。这将使我能够获得特定一周内销售的不同商品的数量。
我知道 Business Objects 中有 Count 和 Count 不同的函数,但是我更愿意为整个原始 table 数据使用这个 1/0 系统,因为我将它用作一个完整的仪表板,并且有很多指标,其中 distinct 将是 part/slicer。
我之前的做法是使用 excel 公式:=IF(SUMPRODUCT(($A$2:$A5000=$A2)*($G$2:$G5000=$G2))> 1,0,1)
这样就可以了,对于 G 列中出现在 A 列特定值范围内的值的第一个实例(A 列是星期)给出“1”,当相同的值再次出现时给出“0” A列中相同的星期值。当星期值改变时,它会再次给出“1”。
由于它是在每行中的 2 个单元格中比较整列数据,因此随着数据变大,这往往会崩溃。
到目前为止,我无法在 Business Objects 中模拟这一点,我想我已经用尽了我的能力和谷歌搜索。
任何人都可以分享他们的两分钱吗?
我想你想要逻辑围绕 row_number()
:
select t.*,
(case when 1 = row_number() over (partition by name, person, week, identifier
order by ??
)
then 1 else 0
end) as new_indicator
from t;
注意 ??
。 SQL table 表示 无序 集合。 table 或一组行中没有 "first" 行,除非列指定了该顺序。 ??
用于此类列(可能是 date/time 列,可能是 id)。
如果你只想标记一行,你可以在那里放任何东西,比如order by (select null)
或order by week
。
假设您在查询中有一个唯一标识一行的对象,您可以通过几个简单的步骤完成此操作。
假设您的查询包含以下对象:
Sale ID
Name
Person
Sale Date
Week #
Price
etc.
您想为每个 Name/Week #.
的第一次出现显示 1第 1 步:创建具有以下定义的变量。我们称它为 [FirstOne]
=Min([Sale ID]) In ([Name];[Week #])
第 2 步:在报告块中,添加具有以下公式的列:
=If [FirstOne] = [Sale ID] Then 1 Else 0
这应该在表示第 # 周内第一次出现 Name 的行中产生 1。如果你想在第一次出现 Name/Person/Week # 时显示 1,你可以相应地修改 [FirstOne] 变量:
=Min([Sale ID]) In ([Name];[Person];[Week #])