SAP BO - 如何在每行中每周获得1/0个不同的值

时间:2017-03-09 14:48:45

标签: sql sql-server excel sap business-objects

我试图解决的问题是让SAP Business Objects查询为我计算变量,因为在一个大的excel文件中计算它会导致进程崩溃。

我有一堆包含每日/每周数据的列。我想得到一个" 1"对于一周内名称/人物/某些识别器的第一个实例和" 0"所有其余的。

例如,如果项目" Glass"在第4周出售5次此变量/列第一次销售将获得" 1"接下来的4个销售将获得" 0"。这将允许我在特定的一周内销售不同商品的数量。

我知道Business Objects中有Count和Count不同的功能,但我更喜欢将这个1/0系统用于整个原始数据表,因为我将它用作整个仪表板的源,并且有很多指标,其中distinct将是part / slicer。

我以前做的方式是使用excel公式:= IF(SUMPRODUCT(($ A $ 2:$ A5000 = $ A2)*($ G $ 2:$ G5000 = $ G2))> 1,0,1 )

这就是诀窍并给出了一个" 1"对于列G中第一个值的实例,出现在A列的某个值范围内(A列是星期)并给出" 0"当相同的值重新出现在A列中的相同周值时。它将给出" 1"当周值改变时再次。

由于随着数据变大,每行比较两行中的2个单元格,因此这会导致崩溃。

到目前为止,我无法在Business Objects中模仿这一点,我认为我已经耗尽了我的能力和谷歌搜索。

有人可以分享他们的两分钱吗?

2 个答案:

答案 0 :(得分:1)

我认为你想要围绕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表表示无序集。除非列指定了排序,否则表或行组中没有“第一”行。 ??用于此类列(可能是日期/时间列,可能是id)。

如果您只想标记一行,则可以在其中放置任何内容,例如order by (select null)order by week

答案 1 :(得分:1)

假设您在查询中有一个唯一标识行的对象,您可以通过几个简单的步骤完成此操作。

假设您的查询包含以下对象:

altparallel="$HOME/newnnm/parallel"

if command -v parallel >/dev/null 2>&1; then
  parallel "$@"
elif [[ -x "$altparallel" ]]; then
  "$altparallel" "$@"
else
  exit 1
fi

您希望在每个姓名/周#的第一次出现时显示1。

步骤1:使用以下定义创建变量。我们称之为Sale ID Name Person Sale Date Week # Price etc.

[FirstOne]

步骤2:在报告栏中,添加一个包含以下公式的列:

=Min([Sale ID]) In ([Name];[Week #])


这应该在行中产生1,表示在一周#中第一次出现Name。如果你想在第一次出现Name / Person / Week#时显示1,你可以相应地修改[FirstOne]变量:

=If [FirstOne] = [Sale ID] Then 1 Else 0