【问题标题】:PL/SQL Group By question adding extra columns dependent on row numbersPL/SQL Group By question 添加取决于行号的额外列
【发布时间】:2021-04-01 07:15:57
【问题描述】:

我正在与一群人斗争。我有一个查询,它为一些已计数的股票提取两行数据。它返回的行是这样的。

但是,我需要将其显示在如下所示的一行中。

此示例仅发生两次计数,但其他示例最多可能有 4 行,因此可能需要 Count 3 和 Count 4 列。计数差异需要是最后一个计数数量 - 第一行原始数量。有一个 dstamp 字段可用于识别每次计数发生的时间。

我用来提取此数据的当前 SQL 如下

Select bin, sku, original_qty, (original_qty + count_qty) countQty, count_difference, quantity, counter
FROM stock_counts
order by bin, dstamp DESC

【问题讨论】:

  • 你怎么知道count 值在count1count2count4 中? stock_counts 表中是否有提供订单的列?也许是约会?
  • 抱歉,是的,我有一个 dstamp 字段。让我知道如果第一个计数。
  • 好的。你怎么知道要显示哪一行的original_qtycountdifferencecounted_by?看起来您正在从一排获取original_qty,从另一排获取countdifference。我猜你是按binsku 对行进行分组?
  • 是的,所以我想按 bin 和 sku 分组,然后原始数量为第一行的原始数量值,然后计数差异为第二行的计数 - 原始数量。
  • 好的。所以countdifference 来自第二行,即使有 4 行? counted_by 是从哪里来的?

标签: sql oracle plsql oracle-sqldeveloper


【解决方案1】:

您甚至没有在结果中返回dstamp。但是如果你想旋转,你可以使用条件聚合。目前还不清楚所有列的含义。但是您可以使用以下方法轻松地按时间调整数量:

select bin, sku,
       max(case when seqnum = 1 then countQty end) as original_qty,
       max(case when seqnum = 2 then countQty end) as qty1,      
       max(case when seqnum = 3 then countQty end) as qty2,        
       max(case when seqnum = 4 then countQty end) as qty3 
from (select sc.*,
             row_number() over (partition by sku, bin order by dstamp) as seqnum
      from stock_counts sc
     ) sc
group by sku, bin;

当然,您需要有足够多的列来涵盖您关心的数量。

【讨论】:

  • 嗨,谢谢!通过一些调整,我设法让它工作。很抱歉这个措辞不好的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2015-09-21
  • 2019-04-11
  • 2011-12-23
  • 2013-08-12
  • 1970-01-01
相关资源
最近更新 更多