【问题标题】:Oracle SQL to return column values from unique rowsOracle SQL 从唯一行返回列值
【发布时间】:2019-11-06 21:42:48
【问题描述】:

我有一个包含多个子批次的单个批次的表格:

+--------+----------+
¦Batch   +Sub-batch ¦
¦--------¦----------¦
¦B_01    ¦SB_01     ¦
¦B_02    ¦SB_02     ¦
¦B_02    ¦SB_03     ¦
¦B_03    ¦SB_04     ¦
+--------+----------+

其中 B_ 和 SB_ 只是批次的名称(标识符),不需要聚合。

我想退货:

+--------+-----------+-----------+
¦Batch   +Sub_Batch1 ¦Sub_Batch2 ¦
¦--------¦-----------¦-----------¦
¦B_01    ¦SB_01      ¦           ¦
¦B_02    ¦SB_02      ¦SB_03      ¦
¦B_03    ¦SB_04      ¦           ¦
+--------+-----------+-----------+

看起来 PARTITION BY 或 PIVOT 是要走的路,但我似乎只能找到聚合函数。

感谢您的帮助!

【问题讨论】:

  • 会不会只有 sub_batch1 和 sub_batch2?你想动态制作吗?
  • 它应该只有两个子批次,但还有其他类似的系统可能会更多,因此动态会很有用。

标签: sql oracle pivot analytic-functions


【解决方案1】:

如果只有 2 个子批次,那么您可以简单地使用 MINMAX 聚合函数,如下所示:

SQL> WITH YOUR_TABLE(Batch, Sub_batch) AS
  2  (SELECT 'B_01', 'SB_01' FROM DUAL UNION ALL
  3  SELECT 'B_02', 'SB_02' FROM DUAL UNION ALL
  4  SELECT 'B_02', 'SB_03' FROM DUAL UNION ALL
  5  SELECT 'B_03', 'SB_04' FROM DUAL)
  6  SELECT
  7      BATCH,
  8      MIN(SUB_BATCH) AS SUB_BATCH1,
  9      CASE
 10          WHEN MIN(SUB_BATCH) <> MAX(SUB_BATCH) THEN MAX(SUB_BATCH)
 11      END AS SUB_BATCH2
 12  FROM YOUR_TABLE
 13  GROUP BY BATCH
 14  ORDER BY BATCH;

BATCH      SUB_BATCH1 SUB_BATCH2
---------- ---------- ----------
B_01       SB_01
B_02       SB_02      SB_03
B_03       SB_04

SQL>

干杯!!

【讨论】:

  • 在 SUB_BATCH 只是一个标识符(字母数字)而不是数字的情况下,MIN 和 MAX 是否有效?
  • 是的!您可以从答案中给出的示例中看到它
  • 谢谢@Tejash,不知怎的完全错过了那个!
【解决方案2】:

您可以先应用row_number()功能,然后使用conditional aggregation

with t as
(
select t0.*,
       row_number() over (partition by Batch order by Sub_batch) as rn
  from t0
)
select Batch,
       max(case when rn = 1 then Sub_batch end) as Sub_Batch1, 
       max(case when rn = 2 then Sub_batch end) as Sub_Batch2
  from t
 group by Batch
 order by Batch;

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2017-01-07
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多